Как скрыть переменную в закрытии Groovy? - PullRequest
0 голосов
/ 01 июня 2018

Я заметил, что не могу скрывать переменные в замыканиях.Например, в функции:

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

, но обавыдает ту же ошибку.

Могу ли я объявить параметры в своих замыканиях так, чтобы мне не нужно было беспокоиться о том, что они определены в родительских областях?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...