我正在学习Groovy并且对它如何构建智能DSL感到非常印象深刻,但我对括号和点是可选的规则感到有些困惑.请考虑以下代码:
Integer take(Integer x) {x}
take 3 plus 4
Run Code Online (Sandbox Code Playgroud)
这按预期工作并产生7的输出(当在控制台中运行时),因为groovy将最后一行理解为take(3).plus(4).
现在,println take 3 plus 4并不像groovy那样理解那println(take).3(plus).4是无稽之谈.
我所看到的每个例子都显示出这些表达式,但显然是这样
s = take 3 plus 4
Run Code Online (Sandbox Code Playgroud)
在s中工作并存储结果7.我的问题是,为什么呢
println( take 3 plus 4 )
Run Code Online (Sandbox Code Playgroud)
不行?显然,groovy会解析这些表达式,即使它们不是在一条线上(如赋值工作所示).我原以为添加这些括号会消除那条不起作用的形式的歧义,并且它会按照我的意图打印7.
相反,groovy会给出错误'意外令牌:3'.据我所知,groovy不会允许println中的可选括号或点,即使它看起来不明确.什么时候这种技巧确实有效?
这属于嵌套方法调用的范畴,在这种情况下您不能省略括号。这会导致歧义,并且结果是意外的,因为 println 方法认为您正在向它传递多个参数。您可以通过在 println 方法中使用常规字符串来减少歧义。
println "${take 3 plus 4}"
Run Code Online (Sandbox Code Playgroud)
更多信息:省略括号
| 归档时间: |
|
| 查看次数: |
898 次 |
| 最近记录: |