有没有办法在Dart中通过引用传递原始参数?

Eri*_*oie 19 dart

我想通过引用传递一个原语(int,bool,...).我在这里找到了关于它的讨论(段落"通过引用传递值类型"):Dart中的值类型,但我仍然想知道是否有办法在Dart中执行它(除了使用对象包装器)?任何发展?

Kai*_*ren 12

Dart语言不支持这一点,我怀疑它会如此,但未来会告诉我们.

基元将按值传递,如前所述,"通过引用传递基元"的唯一方法是将它们包装起来:

class PrimitiveWrapper {
  var value;
  PrimitiveWrapper(this.value);
}

void alter(PrimitiveWrapper data) {
  data.value++;
}

main() {
  var data = new PrimitiveWrapper(5);
  print(data.value); // 5
  alter(data);
  print(data.value); // 6
}
Run Code Online (Sandbox Code Playgroud)

如果您不想这样做,那么您需要找到解决问题的另一种方法.

我看到人们需要通过引用传递的一种情况是,他们想要传递给类中的函数的某种值:

class Foo {
  void doFoo() {
    var i = 0;
    ...
    doBar(i); // We want to alter i in doBar().
    ...
    i++;
  }

  void doBar(i) {
    i++;
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以i改为创建一个类成员.

  • 如果您喜欢泛型,请务必继续。我相信这是解释这一点的最简单方法。:) (2认同)
  • 我从来没有说过有问题。“我怀疑”意味着我怀疑该功能是否到来。这只是我的一个观点,是基于我迄今为止在 Dart 世界中所听到和看到的。Dart 有特定的目标群体和特定的用例。该功能将来可能会出现,也可能不会出现,猜测是没有意义的。就像推测天气一样,可以定义类型的方差。我怀疑这是否可能,但我不知道。 (2认同)

Jus*_*ani 7

不,包装是唯一的方法。


Mar*_*ioP 6

它们是通过引用传递的。这并不重要,因为“原始”类型没有更改其内部值的方法。

如果我错了,请纠正我,但也许您误解了“通过​​引用传递”的含义?我假设您想做类似的事情,param1 = 10并希望10在您从方法中返回时该值仍然存在。但是引用不是指针。当您为参数分配一个新值(使用 = 运算符)时,此更改不会反映在调用方法中。对于非原始类型(类),这仍然是正确的。

例子:

class Test {
  int val;
  Test(this.val);
}

void main() {
  Test t = new Test(1);
  fn1(t);
  print(t.val); // 2
  fn2(t);
  print(t.val); // still 2, because "t" has been assigned a new instance in fn2()
}

void fn1(Test t) {
  print(t.val); // 1
  t.val = 2;
}

void fn2(Test t) {
  t = new Test(10);
  print(t.val); // 10
}
Run Code Online (Sandbox Code Playgroud)

编辑 我试图根据评论使我的答案更加清晰,但不知何故,我似乎无法在不引起更多混乱的情况下正确表达它。基本上,当来自 Java 的人说“参数通过引用传递”时,他们的意思是 C/C++ 开发人员所说的“参数作为指针传递”的意思。