1

以下代码工作正常:

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 似乎覆盖了上面的混合方法。

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

红宝石 1.9.3

4

1 回答 1

1

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

13.6657.round(2)    # => 13.67

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

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

并将其混合到浮动中。稍后在代码中调用该format方法而不是圆形:

13.6657.format     # => 13.67

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

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

a = 13.6657
a.extend MyModule

a.format           # => 13.67

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

于 2012-10-12T07:38:21.290 回答