Понимание заводных замыканий - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь понять, как выполняется разрешение закрытия Groovy в приведенном ниже коде,

foo {
    a=10
    b=20
}

def foo(Closure closure) {
    def params = [:]

    closure.resolveStrategy = Closure.DELEGATE_FIRST
    closure.delegate = params

    closure()

    println params.a
    println params.b
}

В реализации foo значение никогда не присваивается params, тогда как params получает значения для a & b

Я читал о закрытии Groovy, но не мог понять, как это работает ???

1 Ответ

0 голосов
/ 05 ноября 2018

следующая строка определяет стратегию разрешения свойств и методов для закрытия DELEGATE_FIRST . это означает, что для получения / установки / вызова любого свойства / метода он сначала перейдет к объекту delegate, а когда такого свойства / метода не будет, он перейдет к объекту owner.

closure.resolveStrategy = Closure.DELEGATE_FIRST

и следующая строка устанавливает delegate объект замыкания на params

closure.delegate = params

и, наконец, ваше закрытие просто устанавливает два свойства. и эти свойства установлены на delegate объекте (param в данный момент)

{
    a=10
    b=20
}
...