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