Grails и Groovy делегат метапрограммирования - PullRequest
1 голос
/ 06 марта 2012

У меня есть несколько вопросов о делегате в Groovy Meta Programming.

с этой строкой кода

grailsApplication.domainClasses.each { gdc ->
 def domClass = gdc.clazz
 domClass.metaClass.invokeMethod{name,args ->
 //some line of code
 def result = invokeMethod(delegate,args)
 }
}

Что здесь за содержание делегата, имени и аргументов?В общем, что такое делегат и какое у него содержимое?

Буду признателен за любую помощь и объяснение

1 Ответ

5 голосов
/ 06 марта 2012

У вас есть опечатка;domClass.metaClass.invokeMethod{name,args -> должно быть domClass.metaClass.invokeMethod = { String name,args ->.Это назначает Closure, чтобы быть обработчиком для всех вызовов метода в этом классе.Поскольку вы обрабатываете вызовы метода, вам нужно знать имя метода и аргументы метода, поэтому это параметры замыкания.Параметр args будет массивом Object[], содержащим аргументы из вызова метода.Так, например, domClass.foo() будет иметь имя "foo" и пустой массив args, domClass.foo("purple") будет иметь массив из 1 элемента, содержащий строку "purple" и т. Д.

Подумайте о delegateкак this внутри замыкания.this на самом деле является экземпляром класса, в котором определено Closure, а не самим замыканием или объектом, к которому вызывается метод.Поскольку вам часто нужен объект, delegate указывает на него.Обычно делегат будет содержащим экземпляром, в котором определено замыкание, поэтому вызовы методов разрешаются путем просмотра там, и, если не найден, выдается исключение отсутствующего метода.Но вы можете установить делегат в качестве другого обработчика, который имеет вызываемые методы, и вместо этого он будет делегирован.Это особенно полезно для сборщиков Groovy и DSL.

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