为什么`send`在Ruby 2.0改进时失败了?

时间:2013-03-07 04:45:36

标签: ruby ruby-2.0

为什么这不起作用?

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中工作的完整解释。

2 个答案:

答案 0 :(得分:9)

因为the specification这样说:

  

间接方法访问

     

Kernel#sendKernel#methodKernel#respond_to?之类的任何间接方法访问都不会在方法查找过程中尊重调用者上下文中的优化。

答案 1 :(得分:0)

我很想说“这是设计的”。但是再次 it's quite possible this design is not entirely stable 。例如,几个月前moduleclass范围界定功能一直是removed

目前即使在Ruby HEAD上,唯一的方法就是使用万恶之源:

eval "puts 'abcdefghijklmnopqrstuvwxyz'.bar" # => 26

但实际上,这仅适用于实验室,对吧?不要解开这样的代码,小猫会死。