Ruby方式:按零划分

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),这是另一种可能性.


the*_*Man 7

依赖于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)


Jon*_*yes 6

虽然这是一个过时的线程,我想我会用一个简单的衬垫,你可以使用...

@average = variable1 / variable2 rescue 0
Run Code Online (Sandbox Code Playgroud)

  • 不要这样做,内联救援是不好的。它们将掩盖该行中发生的每个错误(考虑 `variable1` 是一个进行一些计算的方法名称),并且很难调试。 (3认同)

esp*_*chi 5

对我来说,最干净的方式是:

numerator / denominator rescue 0
Run Code Online (Sandbox Code Playgroud)

它还可以帮助您避免处理0 / 0.

正如@Andrew指出的那样,这仅对整数有效.有关详细信息,请参阅此答案的评论.

  • 所以,只是摆弄这个,如果你的一个args是一个浮点数,那么这将无法工作,因为它将返回无穷大,所以这只有在你做整数时才可行.通过除法我认为你经常会对分数结果感兴趣,所以浮点数很可能是等式的一部分.不过好主意! (2认同)