猴子修补内部模块以限制其范围

时间:2014-04-11 08:50:32

标签: ruby monkeypatching

当类和语句封装在模块中时,为什么会抛出错误?

module Xchange

  class Float

    def in currency
      self.to_s << " " << suffix(currency)
    end

    private

    def suffix currency
      case currency
      when :euro
        "euros"
      when :dollar
        "dollars"
      when :rupee
        "rupees"
      end
    end

  end

  puts 2.3.in(:euro)
end

3 个答案:

答案 0 :(得分:2)

如果您使用的是当前版本的Ruby,我建议您远离monkeypatching并开始使用Refinements(http://www.ruby-doc.org/core-2.1.1/doc/syntax/refinements_rdoc.html)。通过这种方式,您可以更方便地以Ruby原生方式为某些模块引入“monkeypatches”。

答案 1 :(得分:1)

Opps,我的错!我花了一段时间才弄明白!刚尝试使用Pry查看Float类,我惊讶地发现其中没有其他Float方法。所以,我假设Float我试图重新定义不是全球可用的Float。它是名为Xchange::Float的新类,具有单个实例方法in

因此,简而言之,我相信这样的补丁将是全局的,并且是requires它的所有文件。因此,新版本中的refine点。

答案 2 :(得分:0)

这是因为您已声明了新的课程Xchange::Float,而不是打开现有的Float课程。