Groovy 可选的括号和点

Groovy optional parentheses and dots

我正在学习 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

运行并将结果 7 存储在 s 中。我的问题是,为什么

println( take 3 plus 4 )

不工作?显然,groovy 将解析这些类型的表达式,即使它们本身不在一行中(如作业所示)。我原以为添加这些括号会消除该行形式中不起作用的歧义,并且它会按我的预期打印出 7。

相反 groovy 给出错误 'unexpected token: 3'。据我所知,groovy 不允许在该 println 中使用可选的括号或点,即使它看起来没有歧义。这种技巧到底什么时候起作用?

这属于嵌套方法调用的范畴,在这种情况下不能省略括号。这会导致歧义并且结果出乎意料,因为 println 方法认为您正在向它传递多个参数。您可以通过在 println 方法中使用 groovy 字符串来减少歧义。

println "${take 3 plus 4}"

更多信息:Omit Parentheses