2008-09-25 104 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

相关问题