Groovy可选括号的使用

Groovy可选括号的使用,groovy,dsl,Groovy,Dsl,我正在尝试编写一个DSL,它允许以下语法: foo ["a", "b"], bar: { true } 我认为这应该和定义一个接受属性映射作为第一个参数的方法一样简单,例如: def foo(Map attr, List blar) { ... } 但这种语法似乎会引起问题,想知道是否有人能解释原因,以及是否有一种解决方案可以允许像上面这行这样的无paren语法 groovysh执行示例: groovy:000> def foo(Map attr, List blar) { print

我正在尝试编写一个DSL,它允许以下语法:

foo ["a", "b"], bar: { true }
我认为这应该和定义一个接受属性映射作为第一个参数的方法一样简单,例如:

def foo(Map attr, List blar) { ... }
但这种语法似乎会引起问题,想知道是否有人能解释原因,以及是否有一种解决方案可以允许像上面这行这样的无paren语法

groovysh执行示例:

groovy:000> def foo(Map attr, List blar) { println attr; println blar; }
===> true
groovy:000> foo ["a", "b"], bar: { true }
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException:
startup failed:
groovysh_parse: 1: expecting EOF, found ',' @ line 1, column 15.
   foo ["a", "b"], bar: { true }
                 ^

1 error

        at java_lang_Runnable$run.call (Unknown Source)

这行不通。它将此理解为对
foo
对象的
getAt
方法调用:

foo["a", "b"]
然后逗号就没有意义了

您可以使用varargs:

def foo(Map map, Object... args) { "$map $args" }
a = foo "a", "b", bar: {true}
println a // prints [bar:script_from_command_line$_run_closure1@1f3f7e0] [a, b]
或颠倒参数顺序:

def foo(Map map, args) { "$map $args" }
a = foo bar: {true}, ["a", "b"]
println a

从来没有用过这种方式。很高兴知道。:)只有当存在一个vararg时,映射的位置在调用时才无关紧要?映射在函数定义中排在第一位,我相信这类事情是允许的(因为闭包排在最后,允许它们位于括号之外)@Will:+1。注意,这里的参数似乎不需要类型<代码>def foo(映射,…参数)将起作用。