Mik*_*one 11 ruby closures singleton-methods
所以,我想为一个对象定义一个单例方法,但我想用一个闭包来做.
例如,
def define_say(obj, msg)
def obj.say
puts msg
end
end
o = Object.new
define_say o, "hello world!"
o.say
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为通过"def"定义单例方法不是闭包,所以我得到一个例外,"msg"是一个未定义的变量或方法.
我想做的就是在Module类中使用"define_method"方法,但据我所知,这只能用于在类上定义方法...但我想要一个Singleton方法. ..
所以,我想写这样的东西:
def define_say(obj, msg)
obj.define_singleton_method(:say) {
puts msg
}
end
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何实现这一点,而无需创建存储Proc的方法,然后在单例方法中使用Proc?(基本上,我想要一个干净,非hacky这样做的方式)
asy*_*ric 14
Object#define_singleton_method 顺便加入ruby-1.9.2:
def define_say(obj, msg)
obj.define_singleton_method(:say) do
puts msg
end
end
Run Code Online (Sandbox Code Playgroud)
这是一个答案,可以满足您的需求
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
Run Code Online (Sandbox Code Playgroud)
用法(从IRB粘贴)
>> s = "my string"
=> "my string"
>> define_say(s, "I am S")
=> #<Proc:0xb6ed55b0@(irb):11>
>> s.say
I am S
=> nil
Run Code Online (Sandbox Code Playgroud)
有关更多信息(以及一个使其不那么混乱的小库)请阅读:
http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html
顺便说一句,如果你是一个红宝石程序员,而你还没有读过,那就去吧〜!
| 归档时间: |
|
| 查看次数: |
5335 次 |
| 最近记录: |