如何引发异常而不是返回 NaN

How to raise an exception instead of returning NaN

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

这似乎不可能,但也许有人知道该怎么做。编辑:我收回它,下面的猴子修补解决方案似乎有效。

您可以使用优化来猴子修补 Float#/(请记住 Ruby 中的大多数运算符只是方法)

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

然后在您的module/class中使用模块

class MyClass
  using RaiseExceptionOnNaN

  # Have a try
  0.0 / 0.0
end