首页 > 解决方案 > 在 Dart 中通过引用或指针或值传递

问题描述

我正在尝试编写一些代码,这些代码可以通过其他类的函数添加变量来测试某些作品。我不想写返回、扩展、全局变量但仍然可以添加值。有任何想法吗?还是不可能?

void main() {
  bbb B = new bbb();
  B.bOut();
  
}
class bbb{
  int b = 1;
  void bOut(){
    aaa A = aaa(this.b);
    A.aAdd();
    print(b);
  }
}
class aaa{
  int variableA;
  aaa(this.variableA);
  void aAdd (){
    variableA++;
  }
}

输出为 1

标签: flutterdart

解决方案


Dart 按值传递,其中值是对对象的引用

正如詹姆斯德林所说

我认为 Dart 就像许多面向对象的语言一样,它总是按传递,并且对象的是对它的引用。在真正的引用传递系统中,被调用者可以修改调用者中的变量(与 C++ 的引用参数一样)。

这意味着什么?

假设我在一张纸上写下我的家庭住址并给你。如果你走开撕掉那张纸,或者把地址划掉,写一个不同的地址,这并不会改变我的家或我的地址。不管你对我给你的那张纸做什么,我仍然有同一个家和同一个地址。

但是,如果您使用我在纸上写的地址找到我的家,您可以粉刷建筑物或带走垃圾或种花。这会改变我家的一些事情,但不会改变地址。

Dart 也是如此。您可以将变量作为参数传递给某个函数。如果变量引用的对象是可变的,则函数可以更改对象的状态,但不能更改该对象在内存中的存储位置。

例子

这是上面故事的 Dart 版本,灵感来自这个 Java 示例

void main() {
  Home addressToMyHome = Home('blue');
  Home myAddressCopy = addressToMyHome;

  print('My home is ${addressToMyHome.color}.');
  
  print('Here is my address.');
  writeNewAddressOnPaper(addressToMyHome);
  print('But my home is still ${addressToMyHome.color}.');

  print('Here is my address again.');
  goToMyHomeAndPaintIt(addressToMyHome);
  print('Now my home is ${addressToMyHome.color}.');
  
  if (addressToMyHome == myAddressCopy) {
    print('My address has not changed, though.');
  }
}

void writeNewAddressOnPaper(Home home) {
  home = Home('purple');
  print('You made a new ${home.color} home.');
}

void goToMyHomeAndPaintIt(Home home) {
  home.color = 'purple';
  print('You are painting my home ${home.color}.');
}

class Home {
  String color;
  Home(this.color);
}

这将打印以下故事:

My home is blue.
Here is my address.
You made a new purple home.
But my home is still blue.
Here is my address again.
You are painting my home purple.
Now my home is purple.
My address has not changed, though.

请注意,变量addressToMyHome不包含Home对象本身,而仅包含对象Home在内存中存储位置的值。


推荐阅读