Groovy 可选括号和点

标签 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

运行并将结果 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/

相关文章:

c#-4.0 - 在 .NET 上实现 DSL

grails - 从grails Controller 调用scripts文件夹下的脚本

groovy - 在 groovy 中动态覆盖 `equals` 和 `hashCode`

c# - 如何在 NEST 和 Elastic Search 中基于字段进行聚合?

c# - 帮助学习使用 Irony for .net

java - 任何能够处理数据集的基于 DSL 的框架?

Ruby 元编程

json - Apache NiFi ExecuteScript : Groovy script to replace Json values via a mapping file

jenkins - 将 Jenkins 标签设置为构建参数的值,以实现真正动态的基于节点和标签的构建

Scala、Groovy、Clojure