How to raise an exception instead of returning NaN
我正在尝试在我的代码中找到生成NaN的位置,并且我认为,为此目的,更改Ruby的一般行为以在NaN否则将引发异常将非常有帮助 生成。 例如,尝试0.0 / 0.0而不是返回NaN时引发异常。
它似乎不可能,但也许有人知道如何做到这一点。 编辑:我把它拿回来,下面的猴子补丁解决方案似乎工作。
-
实际上,ruby没有NaN数据类型
-
@maxple嗯,不管是什么,它显示为"NaN"。 我不知道它实际上只是一个字符串或符号还是真正的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#/(请记住,Ruby中的大多数操作符只是方法)
1 2 3 4 5 6 7
| module RaiseExceptionOnNaN
refine Float do
def /(*)
super.tap {|result| raise ZeroDivisionError if result.nan?}
end
end
end |
然后在您的模块/类中,使用该模块
1 2 3 4 5 6
| class MyClass
using RaiseExceptionOnNaN
# Have a try
0.0 / 0.0
end |
-
非常感谢,我试试看。 虽然我不得不写这样的最后一行代码:Float.send(:prepend, RaiseExceptionOnNaN)因为我按照上面显示的方式尝试了private method prepend called for Float:Class (NoMethodError)。
-
非常感谢,似乎按预期工作。
-
这个答案真的很棒。 我希望我可以两次投票。