使用闭包在Groovy中指定默认参数值

时间:2012-07-25 19:07:06

标签: grails groovy parameters closures

让我们考虑下一个功能:

def generateUniqueIdent(String text, uniqueSuffix = {uid -> String.valueOf(uid)}) {
   doSomething(text) + uniqueSuffix()
}

现在,当我尝试下一次修改时:

def generateUniqueIdent(String text, uniqueSuffix = { hash(text) }) {
   doSomething(text) + uniqueSuffix()
}        

..我收到了下一个错误:

  

|错误编译期间出现致命错误   org.apache.tools.ant.BuildException:BUG!阶段'阶段的例外   生成'在源单位''这里的一些路径'试图得到一个变量   名称 text 作为堆栈变量,但是带有此变量的变量   未创建名称(使用--stacktrace查看完整跟踪)

同时,如果我尝试使用名称text作为闭包的参数:

def generateUniqueIdent(String text, uniqueSuffix = {text -> hash(text) }) {
   doSomething(text) + uniqueSuffix(text)
}     

..然后我又收到了一个错误:

  

当前范围已包含名称文本

的变量

问题是:我可以以某种方式从闭包中获取其他参数,该闭包被指定为函数参数之一的默认值吗?

如果没有,那么,为什么我不能使用与所描述的闭包中的一个函数参数相同的名称?

1 个答案:

答案 0 :(得分:2)

您可以使用默认的it参数:

def generateUniqueIdent(String text, uniqueSuffix = { hash(it) }) {
   doSomething(text) + uniqueSuffix(text)
}

working example

或者为闭包参数使用不同的名称而不是text

def generateUniqueIdent(String text, uniqueSuffix = { x -> hash(x) }) {
   doSomething(text) + uniqueSuffix(text)
}

example

不幸的是,在这种情况下,对我来说,从闭包is working访问前一个参数,所以我不知道原来的问题是什么:S