Я хотел бы передать примитив (int, bool, ...) по ссылке. Я нашел обсуждение об этом (параграф «Передача типов значений по ссылке») здесь: value types in Dart, но мне все еще интересно, есть ли способ сделать это в Dart (за исключением использования обертки объекта)? Любое развитие?Есть ли способ передать примитивный параметр по ссылке в Dart?
ответ
Язык Дартс не поддерживает это, и я сомневаюсь, что это когда-либо будет, но будущее скажет.
Примитивы будет передаваться по значению, и, как уже упоминалось здесь, единственный способ «передать примитивы по ссылке» является упаковка их, как:
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
класс вместо этого.
Ваша обертка не является общей, но язык позволяет это улучшение. – mezoni
Если вы используете дженерики, обязательно продолжайте. Я считаю, что это самый простой способ объяснить суть дела. :) –
Ваш ответ - Язык Дартс не поддерживает это, и я сомневаюсь, что он когда-либо будет. В чем проблема? Это можно реализовать в Dart и Dart2JS. Многие предлагаемые функции могут быть реализованы и структурированы для эффективной компиляции в Javascript. Проблема в том, что команда Dart сосредоточилась на исправлении ошибок и улучшении веб-клиента. Я думаю, что это будет реализовано в будущем. Я не нашел проблем, которые мешают этому. Я думаю, что ваша работа далека от дизайна компилятора? Я не ошибаюсь? – mezoni
Нет, обертки - единственный способ.
Они передаются по ссылке. Это просто не имеет значения, потому что «примитивные» типы не имеют методов для изменения их внутренней ценности.
Исправьте меня, если я ошибаюсь, но, возможно, вы не понимаете, что означает «переход по ссылке»? Я предполагаю, что вы хотите сделать что-то вроде 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
}
EDIT Я попытался сделать мой ответ более ясным, на основе замечаний, но почему-то я не могу сформулировать это правильно, не вызывая больше путаницы. В основном, когда кто-то из Java говорит, что «параметры передаются по ссылке», они означают, что разработчик C/C++ мог бы сказать, говоря «параметры передаются как указатели».
@mezoni: Разве ваше определение не означает, что означает «передача по ссылке»? Если параметры были переданы по значению, fn1() в моем примере не будет работать так, как это делает, не так ли? – MarioP
Ну, я хотел сказать, что в Дарте нет никаких примитивных типов. num, int, double, bool - все это объекты и ведут себя так же, как «сложные» классы при передаче в качестве параметров. Кроме того, я думаю, мы оба подразумеваем одно и то же, просто называя его по-другому. Под «pass by reference» я подразумеваю, что ссылка на объект передается, и изменения членов объекта остаются после возвращения функции. Мы сейчас на одной странице? :) – MarioP
Если кто-нибудь знает, как я могу сделать это более ясным в своем ответе, не стесняйтесь его редактировать, потому что я честно понятия не имею, как я должен это говорить. : -/ – MarioP
- 1. typescript есть способ передать параметр методу по ссылке?
- 2. Как передать примитивный тип данных по ссылке?
- 3. Есть ли способ передать параметр методу $ .change()?
- 4. Как передать параметр по ссылке на proc?
- 5. 'передать параметр по ссылке' в Ruby?
- 6. как передать параметр по ссылке в JavaScript
- 7. Не удается передать параметр 2 по ссылке
- 8. «Невозможно передать параметр 1 по ссылке»
- 9. Не удается передать параметр по ссылке - MySQLi
- 10. Java: Лучший способ передать int по ссылке
- 11. Есть ли способ опустить параметр?
- 12. Есть ли способ передать параметр в расширение Chrome?
- 13. Есть ли способ передать параметр маршрутизатору в express nodejs?
- 14. Есть ли способ передать параметр в подпрограмму NATURAL?
- 15. Есть ли лучший способ пройти по ссылке в Perl?
- 16. Как передать глобальную переменную как параметр по ссылке в javascript
- 17. C++ передать параметр по ссылке на другую функцию в функции
- 18. Есть ли способ определить, является ли примитивный аргумент переменным размером?
- 19. F # передать по ссылке
- 20. передать массив по ссылке
- 21. Могу ли я передать объект по ссылке
- 22. Как передать структуру по ссылке?
- 23. Есть ли способ, чтобы передать общий массив как параметр
- 24. есть ли способ передать параметр для art_work для изображения t300x300?
- 25. Есть ли способ передать параметр ServletRequest на JavaScript?
- 26. Передать по ссылке в классе
- 27. Есть ли способ передать функцию-член в метод по ссылке? [JAVA]
- 28. Есть ли способ передать динамический параметр с атрибутом маршрута?
- 29. Невозможно передать параметр 2 по ссылке в строке 47
- 30. Как передать параметр по ссылке на управляемый код в C#?
Мне любопытно, какой у вас прецедент? почему ты хочешь сделать это? –
@ShailenTuli Вы все равно приравниваете? В чем же разница? Мы все живем один раз, и все люди разные. И у всех нас разные интересы. Есть вещи, которые мы используем очень редко. Но это не значит, что они не нужны. – mezoni
Прошу прощения, но я не понимаю комментария. Я просто пытаюсь понять намерение вопрошающего. –