"this
" в блоке означает в Groovy всегда (будь то обычный Java-подобный блок или Closure) окружающий класс (экземпляр). «owner
» является свойством Closure и указывает на внедряемый объект, который является либо классом (экземпляром), а затем таким же, как «this
», или другим Closure. Я бы полностью забыл про сферу действия этой части. Таким образом, в вышеприведенном случае правильно, что «это» относится к матери.
А теперь, чтобы усложнить ситуацию ... "это" и неявное это не то же самое в Groovy. Так что если у вас есть Closure {foo()}
и {this.foo()}
, вы можете получить разные результаты. this.foo()
всегда будет преобразован в класс встраивания, тогда как только foo()
будет разрешен с использованием мета-объектного протокола Groovy (MOP) и может указывать на что-то совершенно другое. Например, сборщик может установить делегат для этого Closure и перехватить вызов метода для стандартного построителя Groovy. Во всяком случае ... именно поэтому эта часть называется динамической областью действия.
Историческая справка:
До Groovy 1.0 «этим» был сам объект Closure. Но был изменен, потому что на самом деле вызов this.foo()
стал невозможным, если строитель перехватил все вызовы. тогда у вас не было возможности вызывать локальные методы изнутри компоновщика. Было много попыток изменить стандартную стратегию разрешения - и большие эмоциональные дискуссии тоже. Но, в конце концов, изменение «this» для ссылки на класс встраивания стало простым решением проблемы и больше соответствует людям, пришедшим с Java, плюс оно позволит вам легко обойти MOP, если вы настаиваете.