2011-03-26 71 views
2

嗨,我有以下代碼片段;「使用」如何在groovy中工作?

class StringCalci 
{ 
     static def plus(Integer self, Integer Operand) 
     { 
       return self.toInteger() * Operand.toInteger() 
     } 
} 
use (StringCalci) 
{ 
     println("inside the Use method!") 
     println(12 + 3) 
} 
println(12+3) 

我很震驚地看到Use在groovy中的使用。事情是這樣的,我可以在運行時將方法添加到類中(我自己的方法)。當我查看上面的代碼時,我正在思考Groovy如何使這樣的事情變得可能!在Use裏面使用println就是乘以兩個給定的數字(因爲我已經覆蓋了plus方法),其中外部println增加了它!我的問題是Groovy如何識別在Use之外的Useprintln之間執行的println。是Use是一個關鍵字/方法?我需要了解這個過程幕後..請讓我知道:) 在此先感謝:)

+0

我不知道任何Groovy,但從它的外觀來看,'println'甚至沒有被觸及 - 只有'+'被超載。 – delnan 2011-03-26 15:36:18

+0

@Delnam:ya加號已被超載..但我想知道'Use'如何使這成爲可能! – 2011-03-26 15:39:00

+0

你有沒有考慮閱讀文檔? – 2011-03-26 16:51:09

回答

5

歡迎來到動態語言的美妙世界,凡事皆有可能,沒有什麼是確定的!

此功能稱爲Categories。至於實施:

  • use其實不是一個關鍵字,但一個方法,Groovy的運行時adds to the Object class,這使得它隨處可見。
  • 我認爲的功能主要是實現在類GroovyCategorySupport
  • Javadoc中來看,它是基於保持地圖在ThreadLocal重寫的方法,然後徵詢每個方法調用。
  • 是的,這對於性能並不那麼好,但幾乎所有Groovy和類似語言提供的動態「魔術」功能(以及其中的很多功能)都是如此。
+0

@Micheal:感謝您的回覆:)並且你的答案在'ThreadLocal'中,現在將搜索這個瞭解更多關於這個:) – 2011-03-26 16:58:28

+0

@Micheal:從你的回答中,'ThreadLocal'是在java中靜態類,其中每個線程都有一個**數字**),其中groovy利用它,實現'使用',我說得對嗎? – 2011-03-26 17:01:40

+0

@Aussies:聽起來很正確。但請注意,我真的只是猜測它是如何基於GroovyCategorySupport的javadoc提到「本地線程上下文」的事實來實現的。 – 2011-03-26 17:08:53