web-dev-qa-db-ja.com

Dartで参照によってプリミティブパラメーターを渡す方法はありますか?

プリミティブ(int、boolなど)を参照で渡したいのですが。私はそれについての議論を見つけました(段落「参照による値型の受け渡し」) Dartの値型 ですが、Dartでそれを行う方法があるかどうかまだ疑問です(オブジェクトラッパーを使用する場合を除く) )?何か開発?

28
Eric Lavoie

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
}

そうしたくない場合は、問題を回避する別の方法を見つける必要があります。

参照渡しする必要があると思う人の1つの例は、クラス内の関数に渡したい何らかの値があるということです。

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

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

この場合、代わりにiをクラスメンバーにすることができます。

10
Kai Sellgren

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

3
Justin Fagnani

それらは参照渡しされます。 「プリミティブ」タイプには内部値を変更するメソッドがないため、問題はありません。

私が間違っている場合は修正してください。「参照渡し」の意味を誤解している可能性がありますか?私はあなたがparam1 = 10のようなことをしたいと思い、メソッドから戻ったときにこの値が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++開発者が「パラメータはポインタとして渡される」と言うことを意味します。

2
MarioP