Groovy可选括号和点

时间:2016-01-10 21:37:16

标签: groovy dsl

我正在学习Groovy并且对它如何构建智能DSL非常印象深刻,但我对括号和点是可选的规则感到有些困惑。请考虑以下代码:

Integer take(Integer x) {x}
take 3 plus 4

这按预期工作并产生7的输出(当在控制台中运行时),因为groovy将最后一行理解为take(3).plus(4)

现在,println take 3 plus 4不起作用,因为groovy理解为println(take).3(plus).4这是无稽之谈。

我看到的每个例子都在一条线上显示了这些表达式,但显然是

s = take 3 plus 4

在s中工作并存储结果7。我的问题是,为什么

println( take 3 plus 4 )

不行吗?显然,groovy会解析这些表达式,即使它们不是在一条线上(如赋值工作所示)。我原以为添加这些括号会消除那条不起作用的形式的模糊性,并且它会按照我的意图打印出来。

相反,groovy会出现错误'意外令牌:3'。据我所知,groovy不允许在println中包含可选的括号或点,即使它看起来并不含糊。什么时候这种技巧确实有效?

1 个答案:

答案 0 :(得分:2)

这属于嵌套方法调用的类别,在这种情况下,您不能省略括号。这导致歧义,结果是意外的,因为println方法认为你传递了多个参数。您可以通过在println方法中使用groovy字符串来减少歧义。

println "${take 3 plus 4}"

更多信息:Omit Parentheses