2012-10-12 58 views
1

下面的代码工作正常:如何使用Ruby模块?

class Float 
    def round 
    self.format.to_f 
    end 

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

然而,似乎不好的做法,猴补丁就像漂浮的一类,因为其他人都在做同样的事情,它会导致问题。

然后我安装了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

IMO,你不应该在'Float'类中做这件事,不管它能够做到'100.76572324.round'有多好。特别是,'format'是一个介绍问题,不应该在'Float'上定义。 [另见](http://stackoverflow.com/a/238921/382818) – Zabba

回答

1

为什么不使用对round呼叫只是说法?

13.6657.round(2) # => 13.67 

但是,如果你确定你需要的模块(以可能调整格式,所有彩车在那里,我建议你刚才定义format方法,例如:

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

而在此混合为Float 后来在代码调用format方法,而不是圆:

13.6657.format  # => 13.67 

这样,它不伤害核心功能(如您初始代码从round定义中删除了参数)。

更妙的是 - 如果你想(可以)查明猴子修补,只需延长特定实例:

a = 13.6657 
a.extend MyModule 

a.format   # => 13.67 

这样,它与其他花车不会一塌糊涂,但你仍可以调整格式没有找到所有在你的代码中调用a.round(2)

+0

这很有帮助。我做了第二个建议,将MyMyodule混合为float。但simplecov会覆盖混合方法。 –