【问题标题】:Why does `send` fail with Ruby 2.0 refinement?为什么 Ruby 2.0 改进后的“发送”失败?
【发布时间】:2013-03-07 04:45:36
【问题描述】:

为什么这不起作用?

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

【问题讨论】:

标签: ruby ruby-2.0


【解决方案1】:

因为the specification是这么说的:

间接方法访问

任何间接方法访问,例如Kernel#sendKernel#methodKernel#respond_to?,都不应在方法查找期间遵守调用者上下文中的细化。

【讨论】:

  • 感谢您澄清 Jorg。你知道为什么吗?
【解决方案2】:

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

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

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

但实际上,这只是为了实验室,对吧?不要解开这样的代码,小猫会死。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    相关资源
    最近更新 更多