Если у меня есть закрытие, прикрепленное к расширению, и закрытие ссылается на значение в расширении, например...
def e = new Expando()
e.val = 'hi'
e.doit = { println delegate.val }
e.doit()
Это работает нормально. и печатает "привет"
Если я вызову закрытие с длинной формой
e.doit.call()
Выдает ошибку
groovy.lang.MissingPropertyException: No such property: val for class: Script1
at Script1$_run_closure1.doCall(Script1.groovy:4)
at Script1$_run_closure1.doCall(Script1.groovy)
at Script1.run(Script1.groovy:6)
Это происходит из-за того, что делегат меняется с e на script. Почему? Я думал, что e.doit() и e.doit.call() должны быть одинаковыми.
Я могу изменить делегата вручную - вот так
def e = new Expando()
e.val = 'hi'
e.doit = { println delegate.val }
e.doit.delegate=e;
e.doit.call()
Любые идеи о том, как пропустить явную настройку делегата?