Ruby 如何引发异常而不是返回NaN

Ruby 如何引发异常而不是返回NaN,ruby,nan,Ruby,Nan,我试图在我的代码中找到生成NaN的位置,我认为,出于这个目的,改变Ruby的一般行为以在生成NaN时引发异常是非常有帮助的。例如,在尝试0.0/0.0而不是返回NaN时引发异常 这似乎是不可能的,但也许有人知道如何做到这一点。编辑:我收回原话,下面的monkey补丁解决方案似乎很有效。您可以使用精化来monkey补丁Float#/(请记住,Ruby中的大多数操作符都只是方法) 然后在您的模块/类中,使用模块 class MyClass using RaiseExceptionOnNaN

我试图在我的代码中找到生成NaN的位置,我认为,出于这个目的,改变Ruby的一般行为以在生成NaN时引发异常是非常有帮助的。例如,在尝试0.0/0.0而不是返回NaN时引发异常


这似乎是不可能的,但也许有人知道如何做到这一点。编辑:我收回原话,下面的monkey补丁解决方案似乎很有效。

您可以使用精化来monkey补丁
Float#/
(请记住,Ruby中的大多数操作符都只是方法)

然后在您的模块/类中,使用模块

class MyClass
  using RaiseExceptionOnNaN

  # Have a try
  0.0 / 0.0
end

ruby没有NaN数据类型,actually@maxple不管是什么,都显示为“南”。我不知道它实际上是一个字符串、一个符号还是一个真正的IEEE 754 NaN。有一个Float::NAN,但是,我相信您已经知道,在IEEE 754中有一系列位模式被解释为非数字,所以不能只有一个这样的值。我查看了Ruby源代码,看起来Ruby正在使用IEEE 754 NaN,但我不能确定。如果你知道更多,我很想听听。我很确定这是一个真正的IEEE 754 NaN。我的试金石是
0/0.0==0/0.0
。如果
true
,则不是IEEE。在Ruby中(至少>=2.2.2),该表达式的计算结果为
false
@Oregonwhiteoak我的错,说得太快了。非常感谢,我正在尝试。虽然我不得不这样写最后一行代码:
Float.send(:prepend,RaiseExceptionOnNaN)
,因为当我按照上面所示的方式尝试时,我得到了为Float:Class(NoMethodError)调用的
私有方法prepend。这个答案非常令人惊叹。我希望我能投两次票。
class MyClass
  using RaiseExceptionOnNaN

  # Have a try
  0.0 / 0.0
end