У вас есть опечатка; 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.
Спасибо за ваш ответ Burt. Но что-то все еще путает меня как noob: 'domClass.metaClass.invokeMethod {String name, args ->}' Так что если я назвал 'this', значит я вызываю замыкание в' .invokeMethod' и если я называю 'delegate', означает, что я вызываю сам 'domClass'? –
'this' является экземпляром, где определено замыкание. В Grails, который обычно находится в BootStrap.groovy или в дескрипторе плагина. Но это бесполезно во время выполнения при вызове метода. «Делегат» - это тот экземпляр, который закрывается, как если бы это был реальный метод, так что это самое близкое к тому, что у вас есть. –
Спасибо за ваше объяснение, Берт. Теперь для меня все ясно. –