我正在尝试编写一个允许语法的DSL:
foo ["a", "b"], bar: { true }
我认为应该像定义一个接受属性映射作为第一个参数的方法一样容易,例如:
def foo(Map attr, List blar) { ... }
但似乎这种语法会导致问题,想知道是否有人可以解释原因,以及是否有解决方案允许像顶部的行那样使用无语言的语法。
示例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)
答案 0 :(得分:5)
它不会起作用。它将此理解为对getAt
对象的foo
方法调用:
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