5

Groovyでの次の構造の目的がわかりません。

もののコレクションがあるときはいつでも、それを呼び出しますitems。コレクション上のその属性にアクセスするだけで、属性にマップできます。

items.prop == items.collect { it.prop }

これは私には奇妙に見えます。最初の表記は、実際にはコレクションオブジェクト自体のプロパティにアクセスすることを意味していると思うからです。たとえば、あいまいさの実際のケースが発生する可能性があります

[[1,2,3],['cat', 'elephant']].size == 2

しかし、前の表記法によれば、それはに等しいはず[3, 2]です。

さらに、収集表記が十分に短くない場合は、次の*.ように正確に使用することを目的としたスプレッドドット演算子があります。

[[1,2,3],['cat', 'elephant']]*.size = [3, 2]

あいまいなドット表記の目的は何ですか?キャラクターを節約するために追加されただけですか、それとも機能せず面倒な*.正当な使用例がありますか?*.collect

4

1 に答える 1

4

私は少し前に、 「Groovy Spread Operator Optional For Properties」というブログ記事を書きました。この記事では、この状況で隠れて何が起こっているのかを掘り下げています。

簡単に言えば、それはよりシンタックス シュガーであり、最終的にはDefaultGroovyMethods.getAt(Collection, String)を呼び出します。

これには大きな利点はありませんが、オブジェクトがコレクションであるか単一のオブジェクトであるかに関係なく正しく動作できるため、一部の DSL の記述が少し簡単になる可能性があります。

于 2012-07-06T17:05:17.827 に答える