Groovy - проблема с делегированием вложенного замыкания - PullRequest
1 голос
/ 22 мая 2019

Я понимаю, что делегирование сначала работает с владельцем по умолчанию, иначе требуется конкретное делегирование. Я не могу понять, как работает делегация с вложенными замыканиями. Мой пример:

class App1 {
String bar = "App1"
}

class App2 {
Closure c1 = {
    String bar = "App2"
    println("Closure 1 - $bar")
    Closure c2 = {
        println("Closure2 - $bar")
    }
    c2.delegate = new App1()
    c2.resolveStrategy = Closure.DELEGATE_ONLY
    c2()
  }
}

App2 app2 = new App2() 
App1 app1 = new App1()

app2.c1.delegate = app1
app2.c1() 
println("***************")

app2.c1.resolveStrategy = Closure.DELEGATE_ONLY // Delegation strictly to 
app2.c1() 

Фолловинг - это результат

Closure 1 - App2
Closure2 - App2
***************
Closure 1 - App2
Closure2 - App2

То, что не имеет смысла для меня, это с последней напечатанной строкой. Даже после делегирования Closure c2 в App1 с DELEGATE_ONLY, почему он рассматривает bar = "App2"?!

1 Ответ

1 голос
/ 22 мая 2019

Он выбирает bar в качестве локальной переменной bar, для его разрешения совсем не нужно смотреть на делегата, поэтому все равно App2

Если вы переместите его за пределызамыкание в приложении 2:

class App2 {
    String bar = "App2"
    Closure c1 = {
        println("Closure 1 - $bar")
        Closure c2 = {
            println("Closure2 - $bar")
        }
        c2.delegate = new App1()
        c2.resolveStrategy = Closure.DELEGATE_ONLY
        c2()
    }
}

Вы получите вывод

Closure 1 - App2
Closure2 - App1
***************
Closure 1 - App1
Closure2 - App1
...