在Dart中可以改变方法内部的参数值吗?

问题描述 投票:0回答:1

在 Dart 中,允许像这样改变方法中的参数值

void changeValue(int num) {
  num = 10;
}

我知道上面的代码不会发生错误,但是

num = 10;
无法更改参数的实际值。 (因为 Dart 是“按值传递”)

我的问题是这些..

  1. 改变参数值可以吗?
  2. Dart 允许开发者更改参数值还有其他原因或意图吗?
dart coding-style
1个回答
0
投票

如果可以并且愿意的话,可以更改函数参数引入的局部变量。

您可以通过将变量设置为final来使其不可能:

void foo(final int value) {
  print(value); 
  value = value + 1; // COMPILATION ERROR: Value is `final`.
}

大多数参数变量可能是最终的,但没有人费心去写

final
,因为没有人分配的可变变量也一样好。 特别是如果没有人考虑分配给他们。

我分配给变量的情况包括:

  • 计算的默认值
    int foo([int? value]) {
      value ??= computeDefault(); // (Cannot be a constant)
      // ...
    }
    
  • 预处理,以防参数“始终”不是您想要的实际值。 (可以说初始化是这种情况的一个特例。) T linkValue<T>(Link<T> node) { while (!node.hasValue) { node = node.next ?? (throw StateError("No values")); } // Do something more. return node.value; }
    解除递归。如果将尾递归函数转换为循环,
    引入一个新变量是浪费空间。
    
  • int treeSum(BinNode? node) { var result = 0; while (node != null) { result += treeSum(node.left); result += node.value; node = node.right; } return result; }
  • (或者这可能只是懒惰。有罪。)
    
    
  • 除非您愿意,否则您的参数变量不是最终的。 只要不改变变量的“含义”,重用它们就完全没问题。 如果原始值
can

至少达到变量的所有用途,通常就可以了。如果不是,那么它可能不再是同一个概念变量。

© www.soinside.com 2019 - 2024. All rights reserved.