是否可以使用块定义Ruby单例方法?

所以,我想为一个对象定义一个单例方法,但我想用一个闭包来做。

例如,

def define_say(obj, msg) def obj.say puts msg end end o = Object.new define_say o, "hello world!" o.say 

这不起作用,因为通过“def”定义单例方法不是闭包,所以我得到一个例外,“msg”是一个未定义的变量或方法。

我想做的就是在Module类中使用“define_method”方法,但据我所知,这只能用于在类上定义方法……但我想要一个Singleton方法。 ..

所以,我想写这样的东西:

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

有没有人知道如何实现这一点,而无需创建一个存储Proc的方法,然后在单例方法中使用Proc? (基本上,我想要一个干净,非hacky这样做的方式)

这是一个答案,可以满足您的需求

 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") => # >> s.say I am S => nil 

有关更多信息(以及一个使其不那么混乱的小库)请阅读:

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

顺便说一句,如果你是一个ruby程序员,而你还没有读过,那就去吧〜!

Object#define_singleton_method添加到ruby-1.9.2:

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