我注意到我无法在闭包中隐藏变量。例如,在函数中:
x = [1, 2, 3]
def foo() {
def item = 'whatever'
x.findAll{ item -> item > 1 }
}
foo()
// org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
// /private/tmp/foo.groovy: 4: The current scope already contains a variable of the name item
// @ line 4, column 14.
// x.findAll{ item -> item > 1 }
// ^
对我来说这是一个问题,因为我想定义带有闭包的DSL,implicitly define it
并让我的用户感到惊讶:
def callClosure(body) {
body()
}
x = [1, 2, 3]
callClosure { x.findAll{ it -> it > 1 } } // same error
是否可以使用变量定义闭包,即使它们可能会遮蔽封闭范围?
我试过这个:
callClosure { x.findAll{ def it -> it > 1 } }
callClosure { x.findAll{ final it -> it > 1 } }
但两者都会产生相同的错误。
我可以在我的闭包中声明参数,这样我就不必担心它们是在父作用域中定义的吗?