2008-09-25 102 views
11

所以,我想爲一個對象定義一個單例方法,但我想使用閉包來完成它。是否可以使用塊定義Ruby單例方法?

例如,

def define_say(obj, msg) 
    def obj.say 
    puts msg 
    end 
end 

o = Object.new 
define_say o, "hello world!" 
o.say 

這不起作用,因爲通過「高清」定義一個單身方法不是封閉的,所以我得到一個例外是「味精」是一個未定義的變量或方法。

我想要做的就像在Module類中使用「define_method」方法,但據我所知,這隻能用於在類上定義方法......但我想一個Singleton方法...

所以,我很想把它寫是這樣的:

def define_say(obj, msg) 
    obj.define_singleton_method(:say) { 
    puts msg 
    } 
end 

有誰知道我可以做到這一點,而無需創建存儲一個Proc,然後使用方法Proc在一個單例方法中? (基本上,我想這樣做的乾淨,無哈克的方式)

回答

8

這裏有一個答案,做了你在找什麼

def define_say(obj, msg) 
    # Get a handle to the singleton class of obj 
    metaclass = class << obj; self; end 

    # add the method using define_method instead of def x.say so we can use a closure 
    metaclass.send :define_method, :say do 
    puts msg 
    end 
end 

使用(從IRB粘貼)

>> s = "my string" 
=> "my string" 
>> define_say(s, "I am S") 
=> #<Proc:[email protected](irb):11> 
>> s.say 
I am S 
=> nil 

欲瞭解更多信息(和一個小庫,使得它不太雜亂)閱讀:

http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html

順便說一句,如果你是一個紅寶石程序員,而你沒有閱讀過,現在就去做〜!

+0

輝煌!完美的作品!多謝! – 2008-09-25 21:21:21

相關問題