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

时间:2013-08-15 17:32:15

标签: dart

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

4 个答案:

答案 0 :(得分:8)

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成为班级成员。

答案 1 :(得分:3)

不,包装是唯一的方法。

答案 2 :(得分:2)

他们通过引用传递。这无关紧要,因为“原始”类型没有改变其内部价值的方法。

如果我错了,请纠正我,但也许你误解了“通过​​引用传递”是什么意思?我假设你想做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 ++开发人员将“参数作为指针传递”的意思。

答案 3 :(得分:0)

当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