Я заметил, что не могу скрывать переменные в замыканиях.Например, в функции:
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 с замыканиями, которые неявно определяют 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 } }
, но обавыдает ту же ошибку.
Могу ли я объявить параметры в своих замыканиях так, чтобы мне не нужно было беспокоиться о том, что они определены в родительских областях?