Groovy可选括号使用

Mar*_*iot 2 dsl groovy

我正在尝试编写一个允许语法的DSL:

foo ["a", "b"], bar: { true }
Run Code Online (Sandbox Code Playgroud)

我认为应该像定义一个接受属性映射作为第一个参数的方法一样容易,例如:

def foo(Map attr, List blar) { ... }
Run Code Online (Sandbox Code Playgroud)

但似乎这种语法会导致问题,想知道是否有人可以解释原因,以及是否有一个解决方案允许像顶部的行那样的无语言语法.

样本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)
Run Code Online (Sandbox Code Playgroud)

Wil*_*ill 5

它不会起作用.它将此理解为对象的getAt方法调用foo:

foo["a", "b"]
Run Code Online (Sandbox Code Playgroud)

然后逗号毫无意义.

你可以使用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]
Run Code Online (Sandbox Code Playgroud)

或者反转参数顺序:

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