我在Ruby On Rails上有一个应用程序。
在应用程序中,我想在Ruby中覆盖除法的父类。
用于处理以下异常。
我到处搜索。我想在应用程序中覆盖ruby division方法。
因此,对于以下结果,它应该返回零。
0.0 / 0
=> NaN
1.0 / 0
=> Infinity
ZeroDivisionError: divided by 0
我可以通过在除法运算时到处更改代码来处理它。但我希望通过覆盖方法本身来节省时间。
答案 0 :(得分:5)
您不需要特殊方法或扩展float类,因为其他答案状态。
Ruby为您提供了一个名为.finite的
http://ruby-doc.org/core-1.9.3/Float.html#method-i-finite-3F
有限? →真或假 如果flt是有效的IEEE浮点数(它不是无限的,并且nan?为假),则返回true。
if value.finite? == false
value = 0
else
value = value
end
上面的例子有点冗长。
答案 1 :(得分:3)
非常类似于:How can I redefine Fixnum's + (plus) method in Ruby and keep original + functionality?
class Float
alias_method :old_div, :/
def /(y)
return NAN if self == y && y == 0.0
return INFINITY if self == 1.0 && y == 0.0
self.old_div(y)
end
end
我知道上面的代码可能不是你想要的。随意按照您想要的方式自定义=)
答案 2 :(得分:2)
覆盖Fixnum
,Decimal
等的划分是可能的,但可能不是最适合您的解决方案。你需要覆盖几个类中的方法,并且它们可能有一些非常讨厌的副作用(记住 - 这些方法不是只从你的代码中调用!!)
我建议你写一些帮助器模块,它将实现这个新行为,你可以调用它而不是/
:
module WeirdMath
self.div(n1, n2)
result = n1 / n2
result.nan? || result.infinite? ? 0 : result
rescue
0
end
end
WeirdMath.div(0.0, 0) # => 0
WeirdMath.div(1.0, 0) # => 0
WeirdMath.div(3.0, 2) # => 1.5