2012-03-06 50 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