【问题标题】:How to use Ruby Module?如何使用 Ruby 模块?
【发布时间】:2012-10-12 06:55:40
【问题描述】:

以下代码可以正常工作:

class Float
  def round
   self.format.to_f
  end

  def format
    "%.2f" % self
  end
end

但是,对 Float 这样的类进行monkeypatch 似乎是一种不好的做法,因为其他人也在做同样的事情,这会导致问题。

然后我安装了 simplecov,问题就开始了:simplecov monkeypatches 相同的方法。

所以我创建了一个模块并将其混合到 Float 中。

module MyModule
  def round
   self.format.to_f
  end

  def format
    "%.2f" % self
  end
end

我猜这也有效。但问题是 simplecov 似乎覆盖了上面的混入方法。

那么,扩展内置类以使其不与其他人的代码冲突的正确方法是什么?

Ruby 1.9.3

【问题讨论】:

  • IMO,你不应该在 Float 课堂上这样做,无论能够做到 100.76572324.round 感觉多么好。特别是,format 是一个演示问题,不应在Float 上定义。 See also

标签: ruby monkeypatching ruby-1.9.3


【解决方案1】:

为什么不在round 调用中只使用参数?

13.6657.round(2)    # => 13.67

但是如果你确定你需要模块(可能会调整所有浮点数的格式,我建议你只定义format 方法:

module MyModule
  def format
    ("%.2f" % self).to_f
  end
end

并将其混合到浮动中。 然后在代码中调用format 方法而不是round:

13.6657.format     # => 13.67

这样它不会损害核心功能(因为您的初始代码从round 定义中删除了参数)。

更好 - 如果您想(可以)精确定位猴子补丁,只需扩展特定实例:

a = 13.6657
a.extend MyModule

a.format           # => 13.67

这样它不会与其他浮点数混淆,但您仍然可以调整格式而无需在代码中找到对a.round(2) 的所有调用。

【讨论】:

  • 这很有帮助。我确实做了第二个建议,将 MyMyodule 混合到浮动中。但是 simplecov 覆盖了混入的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多