28

ダーツの記事で述べたように:

".." 構文は、メソッド (またはセッターまたはゲッター) を呼び出しますが、結果を破棄し、代わりに元のレシーバーを返します。

だから私はこれがうまくいくと思った:

myList..clear().addAll(otherList);

これにより、呼び出すことができないというエラーが発生し.addAllましたnull

の結果でそれが呼び出されたので、明らかに.先行するようです。...addAll.clear()

これを書くには2つの可能性があると思います:

  1. myList..clear()..addAll(otherList);
  2. (myList..clear()).addAll(otherList);(の結果を取得したい場合.addAll()

これは正しいです?.はいの場合、なぜ優先する決定を下すのですか? それは非常に直感に反するようです。次のような構文を避けるためmyList(..clear().useResultOfClear()).addAll(otherList);ですか?

4

5 に答える 5

40

Dart 言語の公式記事Method Cascades in Dartで指摘されているように:

".." 構文は、メソッド (またはセッターまたはゲッター) を呼び出しますが、結果を破棄し、代わりに元のレシーバーを返します

簡単に言うと、メソッド カスケードは、メソッド呼び出しの受信者を繰り返さなければならない状況に構文糖衣を提供します。

以下は、前に引用した記事からの例ベース/コピーです。詳細については、それを読んでください。

add()

リストに複数の要素を追加したいシナリオでは、従来の方法は複数の代入を行うことです:

myList.add("item1");
myList.add("item2");
// add again and again…
myList.add("itemN");

メソッドはオブジェクトmyList.add("item1").add("item1")….add("itemN");ではなく を返すため、次のようなことはできません、結果を破棄して元のレシーバーを返すため、代わりにカスケード演算子を使用できます。add()myListvoidmyList

myList..add("item1")..add("item2")…..add("itemN");
myList.add("item1").add("item2")….add("itemN");

もう一つの例

だから書く代わりに:

var address = getAddress();
address.setStreet(“Elm”, “13a”);
address.city = “Carthage”;
address.state = “Eurasia”
address.zip(66666, extended: 6666);

書くかもしれません

getAddress()
 ..setStreet(“Elm”, “13a”)
 ..city = “Carthage”
 ..state = “Eurasia”
 ..zip(66666, extended: 6666);
于 2014-02-16T10:46:37.543 に答える
24

Gilad Bracha の記事を読むことができます: Dart のメソッド カスケード。その最後に、多くの例が表示されます。

演算子の優先順位については、Lasse Nielsen のこの回答も参照してください。

".." を実際には演算子ではなく、スコープ構造 (括弧など) のように考えると役立ちます。".." から次の ".." または最初の他のスコープ区切り文字 (";"、")"、"}" など) までの新しいスコープを作成します。

基本的にa..b().c()、同じです(t){t.b().c(); return t;}(a)

于 2013-06-10T14:24:06.767 に答える