我正在学习 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 给出错误“意外的标记:3”。据我所知,groovy 不允许在 println 中使用可选的括号或点,即使它看起来并不含糊。这种伎俩到底什么时候起作用?
最佳答案
这属于嵌套方法调用的范畴,在这种情况下您不能省略括号。这会导致歧义,并且结果是意外的,因为 println 方法认为您正在向它传递多个参数。您可以通过在 println 方法中使用常规字符串来减少歧义。
println "${take 3 plus 4}"
更多信息:Omit Parentheses
关于Groovy 可选括号和点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34711081/