带有Groovy的DSL - >传递参数值

时间:2012-08-10 09:07:36

标签: groovy dsl

我是Groovy的新手,我正在尝试为某项特定任务编写迷你DSL。 为此我一直试图解决如下问题: 我想通过调用此代码打印(和/或返回)5(不使用parantheses):

give me 5 

我希望下面这样的定义能够奏效:

def give = {clos ->  return clos} 
def me = {clos ->  println clos; return clos} 

但事实上并非如此。你能帮我解决一下如何定义“给”和“我”,以便用“给我5”这个表达式返回值5,其中 me 必须是一个闭包,给予也可以是metaClass,属性等。

提前致谢! Iv

3 个答案:

答案 0 :(得分:3)

Groovy 1.8+需要

give me 5

并且解析器有效地尝试:

give( me ).5

所以,如果你编写这样的代码,它可以工作:

def give = { map ->  map } 
def me = [:].withDefault { it }

a = give me 5

println a

打印:

5

答案 1 :(得分:1)

你的关闭是正确的。大括号丢失了。试试这个

give(me(5)) or 
give me(5)

否则,如果您完全需要消除大括号,请将这些部分分配给变量,以便让解析器了解确切需要传递的内容。

five = me 5
give five

答案 2 :(得分:-1)

你的方法意味着什么?你写了一个句法要求:

give me 5

如果 me 可以,则需要:

give("me", 5)
give "me", 5 //equivalent "DSL" notation
give("you", 7)
give "you", 7 //equivalent "DSL" notation

//or...
def me= "Mickey", you= "Donald"
give(me, 5)
give me, 5 //equivalent "DSL" notation
give(you, 7)
give you, 7 //equivalent "DSL" notation

如果 me 永远不会改变,语义最接近:

giveMe(5)
giveMe 5 //equivalent "DSL" notation

你已经写过“ me 必须是一个闭包”和“我希望我的规则在没有括号的情况下工作”,从句法约束开始。始终从语义要求开始: - )