如何在Groovy闭包中隐藏变量?

时间:2018-06-01 16:13:25

标签: groovy

我注意到我无法在闭包中隐藏变量。例如,在函数中:

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 } }

但两者都会产生相同的错误。

我可以在我的闭包中声明参数,这样我就不必担心它们是在父作用域中定义的吗?

0 个答案:

没有答案