2017-03-09 60 views
3

我试图找到我的代码中从哪个NaN生成的地方,我认为,为此目的,这将是非常有益的改变一般当NaN以其他方式生成时,Ruby会引发异常。例如,当尝试0.0/0.0而不是返回NaN时引发异常。如何提出一个异常,而不是返回NaN

这似乎不可能,但也许有人知道如何做到这一点。编辑:我收回,下面的猴子补丁解决方案似乎工作。

+0

Ruby没有一个NaN数据类型,实际上是 –

+0

@maxple那么,不管它是否显示为“NaN”。我不知道它实际上只是一个字符串,一个符号还是一个真正的IEEE 754 NaN。有一个Float :: NAN,但是,我相信你已经知道,IEEE 754中有一系列位模式被解释为非数字,所以不能只有一个这样的值。我查看了Ruby源代码,看起来Ruby正在使用IEEE 754 NaN,但我无法确定。如果你更了解它,我会很有兴趣听到。 –

+0

我很确定这是一个真正的IEEE 754 NaN。我的试金石测试是否是“0/0.0 == 0/0.0”。如果“真”,那不是IEEE。在Ruby中(至少> = 2.2.2),该表达式评估为“false”。 –

回答

4

你可以猴子补丁Float#/使用细化(记住,Ruby的大多数运营商都只是方法)

module RaiseExceptionOnNaN 
    refine Float do 
    def /(*) 
     super.tap {|result| raise ZeroDivisionError if result.nan?} 
    end 
    end 
end 

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

class MyClass 
    using RaiseExceptionOnNaN 

    # Have a try 
    0.0/0.0 
end 
+0

非常感谢,我试了一下。尽管我不得不像上面这样编写最后一行代码:'Float.send(:prepend,RaiseExceptionOnNaN)',因为我按照上面显示的方式尝试了'私有方法prepend调用Float:Class(NoMethodError)' 。 –

+0

非常感谢,似乎按预期工作。 –

+0

在这个答案中有太多令人敬畏的东西。我希望我可以两次上调它。 –

相关问题