【问题标题】:Monkey patching inside module to limit its scope在模块内部进行猴子修补以限制其范围
【发布时间】:2014-04-11 08:50:32
【问题描述】:

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

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

【问题讨论】:

  • 你使用的是什么版本的 Ruby?

标签: ruby monkeypatching


【解决方案1】:

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

【讨论】:

  • 嗯,这不会限制 gem 到当前版本的 Ruby 吗?不知何故觉得它是有限的;虽然还没有看到任何真实的数据来决定。
【解决方案2】:

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

所以,简而言之,我相信这样的补丁将是全球性的,并且适用于requires 它的所有文件。因此在新版本中refine 的意义。

【讨论】:

    【解决方案3】:

    这是因为您声明了一个新类Xchange::Float,而不是打开现有的Float 类。

    【讨论】:

    • 是的,我想将 Float 的更改范围限制在 Xchange 模块中。
    • 你不能这样做 - 这意味着你希望某些对象在不同的​​上下文中表现不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多