2

让我们考虑下一个函数:

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

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

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

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

| Error 编译 org.apache.tools.ant.BuildException 期间出现致命错误:BUG!源单元“此处的某些路径”中的“类生成”阶段中的异常尝试获取名称为text作为堆栈变量的变量,但未创建具有此名称的变量(使用 --stacktrace 查看完整跟踪)

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

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

..然后我得到另一个错误:

当前作用域已经包含一个名称为text的变量

问题是:我能否以某种方式从闭包中访问其他参数,该闭包作为默认值分配给函数参数之一?

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

4

1 回答 1

2

您可以使用默认it参数:

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

工作示例

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

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

示例

不幸的是,在这种情况下,从闭包访问前一个参数对我有用,所以我不知道最初的问题是什么:S

于 2012-07-25T19:39:16.753 回答