2013-08-15 67 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への効果的なコンパイルのために、多くの提案された機能を実装し、構造化することができます。ダーツチームがバグ修正とWebクライアントの改善に焦点を当てていたという問題。私はこれが将来実現されると思います。これを防ぐ問題は見つけられませんでした。あなたの仕事はコンパイラの設計とはかけ離れていると思いますか?私は正しいですよ? – mezoni

3

いいえ、ラッパーは唯一の方法です。

3

これは参照渡しです。 "プリミティブ"型には内部値を変更するメソッドがないため、問題ではありません。

私が間違っている場合は私を修正しますが、「参照渡し」とは何かを誤解している可能性がありますか?私はあなたが​​のようなことをしたいと思っていて、あなたの方法から戻るときにこの値をまだ10にしたいと思っています。しかし、参照はポインタではありません。パラメータに新しい値(=演算子)を割り当てると、この変更は呼び出し元のメソッドに反映されません。これは、非プリミティブ型(クラス)の場合でも同じです。

例:

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 - これらはすべてオブジェクトであり、パラメータとして渡されたときに "複雑な"クラスと同じように動作します。また、私たちは同じことを意味していると思います。 「参照渡し」とは、オブジェクトへの参照が渡され、関数の戻り後にオブジェクトメンバーの変更が残っていることを意味します。今私たちは同じページにいますか? :) – MarioP

+0

誰かが私の答えでこれをもっと明確にする方法があれば、それを編集しても構いません。 :/ – MarioP

関連する問題