【问题标题】:Dart : change reference of objectDart:更改对象的引用
【发布时间】:2021-07-11 12:16:53
【问题描述】:

这不会改变'myStuff.stuff'的值,它的值仍然是'start':

void main() {

 Thing myStuff = Thing();
 myStuff.stuff = 'start';
 doStuff(myStuff);
 print(myStuff.stuff);

}

void doStuff(Thing theStuff) {
 theStuff = Thing();
 theStuff.stuff = 'test';
}

class Thing {
 String stuff = '';
}

如何替换函数中的引用对象?

【问题讨论】:

    标签: function dart reference


    【解决方案1】:

    你不能在你展示的方法中做到这一点。 Dart 不是通过引用传递。是传值。

    如果您希望能够执行与此类似的操作,您可以使用另一个对象包装您的 Thing 对象,或者提供修改原始对象的回调。

    包装类方法的类似内容:

    void main() {
      Thing myStuff = Thing();
      myStuff.stuff = 'start';
      
      ThingWrap wrapper = ThingWrap();
      wrapper.thing = myStuff;
      
      doStuff1(wrapper);
      
      print(wrapper.thing.stuff);
    }
    
    void doStuff1(ThingWrap theStuff) {
     var newStuff = Thing();
     newStuff.stuff = 'test';
      
      theStuff.thing = newStuff;
    }
    
    class Thing {
     String stuff = '';
    }
    
    class ThingWrap {
      Thing thing = Thing();
    }
    

    或者回调方法:

    void main() {
      Thing myStuff = Thing();
      myStuff.stuff = 'start';
      
      doStuff1((newVal) {
        myStuff = newVal;
      });
      
      print(myStuff.stuff);
    }
    
    void doStuff1(Function(Thing) callback) {
      var newStuff = Thing();
      newStuff.stuff = 'test';
      callback(newStuff);
    }
    
    class Thing {
     String stuff = '';
    }
    

    根据您提供的示例,目前还不清楚为什么您要这样做。如果提供了这一点,则可能提供更清洁的解决方案。简单地为doStuff 提供一个返回值并将其分配给main 中的myStuff 似乎是做同样事情的明显方法。

    【讨论】:

    • Dart 是通过引用传递对象的,你刚刚用你的包装器证明了它。如果您评论 theStuff = Thing();从我原来的帖子,同样的事情。我想知道的是是否可以替换参考的内容。更改存储在 myStuff 内存地址中的内容,而无需像您在帖子中解释的那样做一些复杂的事情。
    • 至于我为什么要这样做:dart:convert 包使用的标准 fromJson 方法返回一个对象。我想将该对象影响到现有变量中。
    • @ouai 你不太理解“通过引用”这个词。与 Java 一样,Dart 对 一切 都是按值传递的,对于对象,它可以被认为是按值传递引用,就像 C 中的指针一样。参见 this。有些语言确实是通过引用传递的,并且可以在您的问题的示例中做您想做的事情,但 Dart 不是。如果 Dart 真的是通过引用传递,那么您在问题中的示例将完全按照您的意愿工作。
    • @ouai 请再次澄清您为什么要这样做;我没有找到你的解释清楚。 dart:convert AFAIK 中没有 fromJson 方法,所以如果有请链接。而且我不确定“我想将该对象影响到现有变量中”是什么。准确的意思。
    • 好的,这个传递引用的东西是我正在寻找的解释,谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多