为什么这不起作用?
module StringRefinement
refine String do
def bar
length
end
end
end
using StringRefinement
"abcdefghijklmnopqrstuvwxyz".send(:bar)
#NoMethodError: undefined method 'bar' for "abcdefghijklmnopqrstuvwxyz":String
有人可以解释为什么send
在这里不起作用吗?有没有办法动态调用细化中定义的方法?我似乎无法找到关于改进如何在Ruby 2.0中工作的完整解释。
答案 0 :(得分:9)
因为the specification这样说:
间接方法访问
Kernel#send
,Kernel#method
和Kernel#respond_to?
之类的任何间接方法访问都不会在方法查找过程中尊重调用者上下文中的优化。
答案 1 :(得分:0)
我很想说“这是设计的”。但是再次 it's quite possible this design is not entirely stable 。例如,几个月前module
和class
范围界定功能一直是removed。
目前即使在Ruby HEAD上,唯一的方法就是使用万恶之源:
eval "puts 'abcdefghijklmnopqrstuvwxyz'.bar" # => 26
但实际上,这仅适用于实验室,对吧?不要解开这样的代码,小猫会死。