Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ruby模块?_Ruby_Monkeypatching_Ruby 1.9.3 - Fatal编程技术网

如何使用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方法。