诸如通过引用传递或飞镖中的指针之类的方法

时间:2019-08-03 13:23:24

标签: flutter dart

我正在尝试编写一些代码,以便可以通过其他类的功能将变量加起来作为对某些作品的测试。我不想写return,extends,global变量,但仍然可以添加值。有任何想法吗?还是不可能?谢谢!

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

3 个答案:

答案 0 :(得分:1)

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

jamesdlin said

我认为Dart就像many object-oriented languages一样,因为它始终是传递,并且对象的 value 是对它。在真正的按引用传递系统中,被调用方可以修改调用方中的变量(与C ++的引用参数一样)。

那是什么意思?

说我将我的家庭住址写在纸上,然后交给您。如果您离开并撕掉纸张或划掉地址并写另一张纸,那不会改变我的住所或地址。无论您对我给您的那张纸做什么,我仍然有相同的住所和相同的地址。

但是,如果您使用我在纸上写的地址来寻找我的家,则可以给建筑物上油漆或带走垃圾或种花。那会改变我家的一些东西,但不会改变地址。

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

示例

这是上面故事的Dart版本,灵感来自this Java example

def AND(first, second):
    if bool(first) == True:
        return second
    else:
        return first


def OR(first, second):
    if bool(first) == True:
        return first
    else:
        return second

这将打印以下故事:

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对象存储在内存中的值。

答案 1 :(得分:1)

免责声明:我是 Dart 的新手(大约 3 天的杂耍,仍然在规范的前几页)但来自 C# 我做了最简单的测试:

class Obj {
    String s1;
}

class Outer {
    Obj obj;

    Outer() {
        obj = Obj();
        obj.s1 = "Stuff";
    }

    void passValueToInner() {
        var inner = Inner();
        print("Obj.s1 = ${obj.s1}");
        inner.changeObj(obj);
        print("Obj.s1 = ${obj.s1}");
    }
}

class Inner {
    void changeObj(Obj obj) {
        obj.s1 = "OtherStuff";
        obj = null;
    }
}

It prints:

Outer.Obj.s1 = Stuff
Obj is null? true
Outer.Obj.s1 = OtherStuff

因此,在 C/C++ 和其他意义上,对象似乎并没有真正通过引用传递。 Dart 将指向内存中对象的新句柄(或托管向量,无论...新手还记得...)传递给被调用的方法/函数。 这就是为什么如果你改变它,它就像 byRef 一样。当您将其设为 null 时,您只是在处理句柄。

答案 2 :(得分:0)

欢迎来到韦斯利!

在Dart中,就像在许多其他面向对象的编程语言中一样,对象始终是按值传递的。但是您仍然可以按值传递指向对象和数组的指针。感谢@jamesdlin在评论中指出这一点。有关此主题的更多信息,请参见:Is Java pass-by-reference or pass-by-value?

除了传递this.b之外,您还可以传递对对象bbb的引用并访问变量b。我准备了一个简单的示例:

输出:

0
1

代码:

class Wrapper {
  int i;
}

test() {
  Wrapper wrapper = Wrapper();

  wrapper.i = 0;
  print(wrapper.i);

  increase(wrapper);
  print(wrapper.i);
}

increase(Wrapper wrapper) {
  wrapper.i++;
}