Можно ли изменить ссылку на аргумент в Dart? - PullRequest
0 голосов
/ 21 марта 2019

Не уверен, что терминология в названии верна на 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

Возможно ли это в Дартсе, и если да, то как?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Нет, Дарт не передает аргументы по ссылке. (Без чего-то вроде системы и правил сложного типа в C ++ непонятно, как это будет работать, если вызывающая сторона не свяжет аргумент с переменной.)

Вместо этого вы можете добавить уровень косвенности (то есть, поместив obj1 внутри другого объекта, такого как List, Map или вашего собственного класса). Другая возможность состояла бы в том, чтобы сделать doSomethingElse вложенной функцией, а затем она могла бы напрямую обращаться и изменять переменные в пределах объема.

1 голос
/ 21 марта 2019

У вас есть проблема со ссылкой в ​​этой функции,

Когда вы вызываете 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');
}

вывод: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...