2012-03-06 48 views
1

我有一些关于groovy元编程中的委托的noob问题。Grails和Groovy metaProgramming代表

与这行代码

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

是什么的代表,名称和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'? – 2012-03-07 04:33:40

+1

'this'是定义闭包的实例。在通常位于BootStrap.groovy中的Grails中,或插件描述符。但是在调用方法时,这在运行时没有用处。 'delegate'是闭包被调用的实例,就好像它是一个真正的方法,所以它是最接近'this'的那个。 – 2012-03-07 06:09:06

+0

感谢您的解释,Burt。现在一切都清楚了。 – 2012-03-07 06:51:07