是否可以修改 Dart 中参数的引用?

Is it possible to modify the reference of an argument in Dart?

不确定标题中的术语是否 100% 正确,但这个例子很容易说明我的意思:

class MyClass{
  String str = '';  
  MyClass(this.str);
}


void main() {
  MyClass obj1 = MyClass('obj1 initial');

  print(obj1.str);

  doSomething(obj1);  
  print(obj1.str);

  doSomethingElse(obj1);
  print(obj1.str);
}



void doSomething(MyClass obj){
  obj.str = 'obj1 new string';
}

void doSomethingElse(MyClass obj){
  obj = MyClass('obj1 new object');
}

这将打印

obj1 initial
obj1 new string
obj1 new string

但是,如果我希望 doSomethingElse() 实际修改 obj1 所引用的内容,那么输出将是:

obj1 initial
obj1 new string
obj1 new object

这在 Dart 中可行吗?如果可行,如何实现?

你在那个函数中有引用问题,

当你在 main 中调用 doSomethingElse(obj1) 时,

MyObject obj 参数引用 obj1 值,

那么 obj 你引用的是 MyClass('obj1 new objcet'),

并且您没有更改 main

中的 obj1 引用
void doSomethingElse(MyClass obj){ // let's say we gave the parameter obj1
  // here obj referencing the obj1 value
  obj = MyClass('obj1 new object');
  //and then it is referencing the MyClass('obj1 new object') value
  //nothing change for obj1 it still referencing the same value
}

您可以 return 该对象并像这样引用该对象,

class MyClass {
  String str = '';
  MyClass(this.str);
}

void main() {
  MyClass obj1 = MyClass('obj1 initial');

  print(obj1.str);

  doSomething(obj1);
  print(obj1.str);

  obj1 = doSomethingElse();
  print(obj1.str);
}

void doSomething(MyClass obj) {
  obj.str = 'obj1 new string';
}

MyClass doSomethingElse() {
  return MyClass('obj1 new object');
}

输出:

不,Dart 不通过引用传递参数。 (如果没有 C++ 的复杂类型系统和规则,如果调用者没有将参数绑定到变量,它会如何工作还不清楚。)

您可以添加一个间接级别(即,将 obj1 放入另一个对象中,例如 ListMap 或您自己的 class ).另一种可能性是使 doSomethingElse 成为一个嵌套函数,然后它可以直接访问和修改封闭范围内的变量。