关于ruby:如何引发异常而不是返回NaN

How to raise an exception instead of returning NaN

我正在尝试在我的代码中找到生成NaN的位置,并且我认为,为此目的,更改Ruby的一般行为以在NaN否则将引发异常将非常有帮助 生成。 例如,尝试0.0 / 0.0而不是返回NaN时引发异常。

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


您可以使用细化来修补补丁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