2013-08-15 7 views
10

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

+0

Мне любопытно, какой у вас прецедент? почему ты хочешь сделать это? –

+0

@ShailenTuli Вы все равно приравниваете? В чем же разница? Мы все живем один раз, и все люди разные. И у всех нас разные интересы. Есть вещи, которые мы используем очень редко. Но это не значит, что они не нужны. – mezoni

+0

Прошу прощения, но я не понимаю комментария. Я просто пытаюсь понять намерение вопрошающего. –

ответ

5

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

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

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 класс вместо этого.

+0

Ваша обертка не является общей, но язык позволяет это улучшение. – mezoni

+0

Если вы используете дженерики, обязательно продолжайте. Я считаю, что это самый простой способ объяснить суть дела. :) –

+0

Ваш ответ - Язык Дартс не поддерживает это, и я сомневаюсь, что он когда-либо будет. В чем проблема? Это можно реализовать в Dart и Dart2JS. Многие предлагаемые функции могут быть реализованы и структурированы для эффективной компиляции в Javascript. Проблема в том, что команда Dart сосредоточилась на исправлении ошибок и улучшении веб-клиента. Я думаю, что это будет реализовано в будущем. Я не нашел проблем, которые мешают этому. Я думаю, что ваша работа далека от дизайна компилятора? Я не ошибаюсь? – mezoni

3

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

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 
} 

EDIT Я попытался сделать мой ответ более ясным, на основе замечаний, но почему-то я не могу сформулировать это правильно, не вызывая больше путаницы. В основном, когда кто-то из Java говорит, что «параметры передаются по ссылке», они означают, что разработчик C/C++ мог бы сказать, говоря «параметры передаются как указатели».

+0

@mezoni: Разве ваше определение не означает, что означает «передача по ссылке»? Если параметры были переданы по значению, fn1() в моем примере не будет работать так, как это делает, не так ли? – MarioP

+0

Ну, я хотел сказать, что в Дарте нет никаких примитивных типов. num, int, double, bool - все это объекты и ведут себя так же, как «сложные» классы при передаче в качестве параметров. Кроме того, я думаю, мы оба подразумеваем одно и то же, просто называя его по-другому. Под «pass by reference» я подразумеваю, что ссылка на объект передается, и изменения членов объекта остаются после возвращения функции. Мы сейчас на одной странице? :) – MarioP

+0

Если кто-нибудь знает, как я могу сделать это более ясным в своем ответе, не стесняйтесь его редактировать, потому что я честно понятия не имею, как я должен это говорить. : -/ – MarioP

Смежные вопросы