如何使用Ruby模块?

时间:2012-10-12 06:55:40

标签: ruby monkeypatching ruby-1.9.3

以下代码可以正常使用:

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

1 个答案:

答案 0 :(得分:1)

为什么不在round电话上使用参数?

13.6657.round(2)    # => 13.67

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

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

将其混合到Float中。 稍后在代码中调用format方法而不是round:

13.6657.format     # => 13.67

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

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

a = 13.6657
a.extend MyModule

a.format           # => 13.67

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