2016-01-10 3 views
6

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の中に任意のかっこやドットを入れることはできません。この種の仕掛けが正確に働くのはいつですか?

答えて

2

これはネストされたメソッド呼び出しのカテゴリに該当します。この場合、かっこは省略できません。 printlnメソッドは、複数のパラメータを渡していると考えているため、これはあいまいさを引き起こし、結果は予期しないものになります。 printlnメソッドで文字列を使用することで、あいまいさを減らすことができます。

println "${take 3 plus 4}" 

詳細情報:printlnのは3を取るプラス4`動作しませんが、printlnをなぜ `(3を取るプラス4)ではない`ない理由 `対処う

+1

Omit Parenthesesとしてそこではいけませんそこに何らかのあいまいさがあります(複数のパラメータとして解釈される場合は、それらの間にコンマがあるので、意味が分からないと判断できます)。さらに、このリンクでは、代入では機能しないはずです(コード例では機能していますが)。それは今少し古いですかと思います。言語ガイドはそれほど厳格ではなく、最後の形式のようにラップされたときに動作するはずです。 – Matthew

+0

+1私はそれがprintlnで動作するように得ることができますが、私は完全に私の質問に答えるかどうかはわかりません。 – Matthew

+0

これはあいまいです。なぜなら、printlnメソッドは、操作を実行する前に、コード** take 3 plus 4 ** _to_ ** take(3).plus(4)**を評価することを知らないからです。 '='記号の右にあるものはすべて式であり、変数に代入される前に評価されます。 $ {}はこのコードを最初に評価してから、printlnを呼び出します。 – dspano

関連する問題