2012-03-06 4 views
1

У меня есть несколько вопросов о делегатах в метавом программировании.Грааля и Groovy metaProgramming делегат

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

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

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

Любая помощь и объяснение будет оценено

ответ

5

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

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

+0

Спасибо за ваш ответ Burt. Но что-то все еще путает меня как noob: 'domClass.metaClass.invokeMethod {String name, args ->}' Так что если я назвал 'this', значит я вызываю замыкание в' .invokeMethod' и если я называю 'delegate', означает, что я вызываю сам 'domClass'? –

+1

'this' является экземпляром, где определено замыкание. В Grails, который обычно находится в BootStrap.groovy или в дескрипторе плагина. Но это бесполезно во время выполнения при вызове метода. «Делегат» - это тот экземпляр, который закрывается, как если бы это был реальный метод, так что это самое близкое к тому, что у вас есть. –

+0

Спасибо за ваше объяснение, Берт. Теперь для меня все ясно. –

Смежные вопросы