我是Groovy的新手,我正在尝试为某项特定任务编写迷你DSL。 为此我一直试图解决如下问题: 我想通过调用此代码打印(和/或返回)5(不使用parantheses):
give me 5
我希望下面这样的定义能够奏效:
def give = {clos -> return clos}
def me = {clos -> println clos; return clos}
但事实上并非如此。你能帮我解决一下如何定义“给”和“我”,以便用“给我5”这个表达式返回值5,其中 me 必须是一个闭包,给予也可以是metaClass,属性等。
提前致谢! Iv
答案 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 必须是一个闭包”和“我希望我的规则在没有括号的情况下工作”,从句法约束开始。始终从语义要求开始: - )