Есть ли способ передать примитивный параметр по ссылке в Dart?

Я хотел бы передать примитив (int, bool,...) по ссылке. Я нашел дискуссию об этом (параграф "Передача типов значений по ссылке" ) здесь: типы значений в Dart, но мне все еще интересно, есть ли способ сделать это в Dart (кроме использования обертки объекта)? Любая разработка?

Ответ 1

Язык Дарт не поддерживает это, и я сомневаюсь, что он когда-либо будет, но будущее скажет.

Примитивы будут переданы по значению, и, как уже упоминалось здесь, единственный способ "передать примитивы по ссылке" - это обернуть их так:

class PrimitiveWrapper {
  var value;
  PrimitiveWrapper(this.value);
}

void alter(PrimitiveWrapper data) {
  data.value++;
}

main() {
  var data = new PrimitiveWrapper(5);
  print(data.value); // 5
  alter(data);
  print(data.value); // 6
}

Если вы не хотите этого делать, вам нужно найти другой способ решения вашей проблемы.

В одном случае, когда я вижу людей, которым нужно пройти по ссылке, это то, что они имеют какое-то значение, которое они хотят передать функциям в классе:

class Foo {
  void doFoo() {
    var i = 0;
    ...
    doBar(i); // We want to alter i in doBar().
    ...
    i++;
  }

  void doBar(i) {
    i++;
  }
}

В этом случае вы можете просто сделать i членом класса.

Ответ 2

Нет, обертки - единственный способ.

Ответ 3

Они передаются по ссылке. Это просто не имеет значения, потому что "примитивные" типы не имеют методов для изменения их внутреннего значения.

Исправьте меня, если я ошибаюсь, но, может быть, вы не понимаете, что означает "передача по ссылке"? Я предполагаю, что вы хотите сделать что-то вроде param1 = 10 и хотите, чтобы это значение по-прежнему было 10 при возврате из вашего метода. Но ссылки не являются указателями. Когда вы назначаете параметру новое значение (с = operator), это изменение не будет отражено в вызывающем методе. Это все еще верно для не-примитивных типов (классов).

Пример:

class Test {
  int val;
  Test(this.val);
}

void main() {
  Test t = new Test(1);
  fn1(t);
  print(t.val); // 2
  fn2(t);
  print(t.val); // still 2, because "t" has been assigned a new instance in fn2()
}

void fn1(Test t) {
  print(t.val); // 1
  t.val = 2;
}

void fn2(Test t) {
  t = new Test(10);
  print(t.val); // 10
}

ИЗМЕНИТЬ Я попытался сделать мой ответ более ясным, основываясь на комментариях, но каким-то образом я не могу представить его правильно, не вызывая больше путаницы. В основном, когда кто-то из Java говорит, что "параметры передаются по ссылке", они означают, что разработчик C/С++ мог бы означать, говоря "параметры передаются как указатели".