60

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

4

4 回答 4

55

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
}

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

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

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

  void doBar(i) {
    i++;
  }
}

在这种情况下,您可以i改为创建一个班级成员。

于 2013-08-16T12:38:29.067 回答
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
}

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

于 2013-08-16T08:31:35.453 回答
5

不,包装是唯一的方法。

于 2013-08-15T19:32:24.520 回答
2

由于 dart 被编译成 JavaScript,我尝试了一些适用于 JS 的方法,你猜怎么着!?它适用于飞镖!

基本上,您可以做的是将您的值放入一个对象中,然后对该函数内部的该字段值所做的任何更改也会更改该函数外部的值。

代码(你可以在dartpad.dev上运行它)

main() {
  var a = {"b": false};
  
  print("Before passing: " + a["b"].toString());
  trial(a);
  print("After passing: " + a["b"].toString());
}

trial(param) {
  param["b"] = true;
}

输出

Before passing: false
After passing: true
于 2020-08-02T08:09:52.553 回答