Groovyを学んでいて、インテリジェントなDSLを構築する方法にかなり感心していますが、括弧とドットがオプションの場合のルールでは少し混乱します。次のコードを考えてみましょう:Groovyのオプションのカッコとドット
Integer take(Integer x) {x}
take 3 plus 4
これは期待通りに動作し、グルーヴィーはtake(3).plus(4)
としてその最後の行を理解して、(コンソールで実行されていました)7の出力を生成します。
今、println take 3 plus 4
は意味がありませんprintln(take).3(plus).4
とgroovyが理解しているように動作しません。
私はライン上で自分自身でショーに表現のこれらの並べ替えを見ていますすべての例が、どうやら
s = take 3 plus 4
作品や店舗s内の結果7。私の質問は、なぜですか
println(take 3 plus 4)
は機能しませんか?明らかに、groovyは、たとえそれが自分自身で行ではなくても(割り当て作業で示されているように)、これらの種類の式を解析します。私はそれらの括弧を追加すると、あまり効果がない行の形からあいまいさが取り除かれ、意図した通りに7が印刷されると思っていたでしょう。
代わりにgroovyが 'unexpected token:3'というエラーを出します。私が知る限り、groovyはあいまいではないように見えますが、そのprintlnの中に任意のかっこやドットを入れることはできません。この種の仕掛けが正確に働くのはいつですか?
Omit Parenthesesとしてそこではいけませんそこに何らかのあいまいさがあります(複数のパラメータとして解釈される場合は、それらの間にコンマがあるので、意味が分からないと判断できます)。さらに、このリンクでは、代入では機能しないはずです(コード例では機能していますが)。それは今少し古いですかと思います。言語ガイドはそれほど厳格ではなく、最後の形式のようにラップされたときに動作するはずです。 – Matthew
+1私はそれがprintlnで動作するように得ることができますが、私は完全に私の質問に答えるかどうかはわかりません。 – Matthew
これはあいまいです。なぜなら、printlnメソッドは、操作を実行する前に、コード** take 3 plus 4 ** _to_ ** take(3).plus(4)**を評価することを知らないからです。 '='記号の右にあるものはすべて式であり、変数に代入される前に評価されます。 $ {}はこのコードを最初に評価してから、printlnを呼び出します。 – dspano