And*_*rew 19 ruby refactoring divide-by-zero
我有以下方法来计算平均值:
def compute_average(a,b,c,d,e)
total = [a,b,c,d,e].sum.to_f
average = [a, 2*b, 3*c, 4*d, 5*e].sum / total
average.round(2)
end
Run Code Online (Sandbox Code Playgroud)
这没什么特别的,但它有一个问题,我期望所有平均方程都有:如果输入全为零,它可能除以零.
所以,我想到这样做:
def compute_average(a,b,c,d,e)
total = [a,b,c,d,e].sum.to_f
if total==0
average = 0.00
else
average = [a, 2*b, 3*c, 4*d, 5*e].sum / total
average.round(2)
end
end
Run Code Online (Sandbox Code Playgroud)
......这样可行,但对我来说感觉很糟糕.有没有更优雅的"Ruby Way"来避免这种划分为零的问题?
我希望我拥有的是"除非那么"的操作员,比如......
average = numerator / denominator unless denominator == 0 then 0
Run Code Online (Sandbox Code Playgroud)
有什么建议?
Mar*_*une 60
您可以使用nonzero?
,如:
def compute_average(a,b,c,d,e)
total = [a,b,c,d,e].sum.to_f
average = [a, 2*b, 3*c, 4*d, 5*e].sum / (total.nonzero? || 1)
end
Run Code Online (Sandbox Code Playgroud)
更多的人会更熟悉使用三元运算符(total == 0 ? 1 : total)
,这是另一种可能性.
依赖于rescue
捕获异常,然后返回默认值是很常见的:
def compute_average(a, b, c, d, e)
total = [a, b, c, d, e].sum.to_f
average = [ a, 2*b, 3*c, 4*d, 5*e ].sum / total
average.round(2)
rescue ZeroDivisionError
0.0
end
Run Code Online (Sandbox Code Playgroud)
我也写道:
average = numerator / denominator unless denominator == 0 then 0
Run Code Online (Sandbox Code Playgroud)
如
average = (denominator == 0) ? 0 : numerator / denominator
Run Code Online (Sandbox Code Playgroud)
虽然这是一个过时的线程,我想我会用一个简单的衬垫,你可以使用...
@average = variable1 / variable2 rescue 0
Run Code Online (Sandbox Code Playgroud)
对我来说,最干净的方式是:
numerator / denominator rescue 0
Run Code Online (Sandbox Code Playgroud)
它还可以帮助您避免处理0 / 0
.
正如@Andrew指出的那样,这仅对整数有效.有关详细信息,请参阅此答案的评论.