【问题标题】:Is it possible to modify the reference of an argument in Dart?是否可以修改 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 中是否可行,如果可以,如何实现?

【问题讨论】:

    标签: dart flutter pass-by-reference pass-by-pointer


    【解决方案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');
      }
      

      输出:

      【讨论】:

        猜你喜欢
        • 2015-12-27
        • 1970-01-01
        • 2020-11-22
        • 1970-01-01
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多