如何使用Ruby模块?
以下代码可以正常工作:如何使用Ruby模块?,ruby,monkeypatching,ruby-1.9.3,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 MyModu
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为什么不在
轮调用中使用参数呢
13.6657.round(2) # => 13.67
但如果您确定需要模块(可能需要调整所有浮动的格式),我建议您只定义format
方法如下:
module MyModule
def format
("%.2f" % self).to_f
end
end
然后把它混在一起漂浮。
稍后在代码中,您将调用format
方法,而不是round:
13.6657.format # => 13.67
这样就不会损害核心功能(因为您的初始代码从轮定义中删除了参数)
更妙的是,如果您想(能够)找到猴子补丁,只需扩展特定实例:
a = 13.6657
a.extend MyModule
a.format # => 13.67
这样它就不会与其他浮动混淆,但您仍然可以调整格式,而不会在代码中找到对a.round(2)
的所有调用。为什么不在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
这样就不会损害核心功能(因为您的初始代码从轮定义中删除了参数)
更妙的是,如果您想(能够)找到猴子补丁,只需扩展特定实例:
a = 13.6657
a.extend MyModule
a.format # => 13.67
这样它就不会与其他浮动混淆,但您仍然可以调整格式,而不必找到对a.round(2)的所有调用
在你的代码中。IMO,你不应该在Float
类中这样做,不管你能做100.7657324.round
感觉有多好。尤其是,格式
是一个表达问题,不应该在Float
类中定义。IMO,你不应该在Float
类中这样做,不是吗能做100.7657324.round
感觉有多好。特别是,格式
是一个演示问题,不应该在Float
上定义。这很有帮助。我做了第二个建议,将MyMyModule混合到Float中。但是simplecov覆盖了mixed-in方法。这很有帮助。我做了第二个建议,mi将MyMyModule转换为float。但是simplecov会覆盖mixed-in方法。