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

Posted

技术标签:

【中文标题】是否可以修改 Dart 中参数的引用?【英文标题】:Is it possible to modify the reference of an argument in Dart? 【发布时间】:2019-08-12 02:21:46 【问题描述】:

不确定标题中的术语是否 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 中是否可行,如果可以,如何实现?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

MyObject obj参数引用obj1值

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

并且您没有更改主目录中的 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

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

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 中参数的引用?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以将参数传递给 dart 中的引用方法吗?

Dart是否支持函数式编程?

PHP是不是优化数组类型的函数参数,而不是通过引用显式传递,当它们没有被修改时?

abap 值传递 引用传递

复制通过引用方法传递的参数的最佳实践,避免无意中修改参数

关联引用