Я хотел бы передать примитив (int, bool,...) по ссылке. Я нашел дискуссию об этом (параграф "Передача типов значений по ссылке" ) здесь: типы значений в Dart, но мне все еще интересно, есть ли способ сделать это в 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/С++ мог бы означать, говоря "параметры передаются как указатели".