2017-03-09 59 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

在這個答案中有太多令人敬畏的東西。我希望我可以兩次上調它。 –

相關問題