Ruby ruby 应该如何取某个列表的平均数呢?

wuwx · 2012年09月25日 · 最后由 charles 回复于 2012年09月27日 · 3826 次阅读

我刚开始是这么写的

def average(list)
  list.sum / list.length
end

不过,当传入的 list 长度为 0 的时候就出错了,于是代码就改成:

def average(list)
  if list.length > 0
    list.sum / list.length
  else
    0
  end
end

倒是可以工作了,不过代码看起来还丑的样子 大家有什么解决办法么?

刚刚看到一个写法:

def average(list)
  list.blank? and 0 or list.sum / list.length
end

你这样不是挺好的吗,不过我喜欢这样写

return 0 if list.size == 0
list.sum / list.size

清晰明白

#2 楼 @fresh_fish 那个写法倒是可以工作,不过代码 2 个地方用了 list.length 并且来了一个 if else 感觉坏味道很明显呀

def average(list)
  list.sum / list.length rescue 0
end

我现在暂时这么写了……

在 rails 里面可以

list.tap {|i| return (i.inject(&:+).try(:/, i.size)) }

@wuwx 不用这么纠结吧,主要代码能清晰易懂,我还是赞成你原来的写法

#5 楼 @diudiutang 返回值还是原数组啊?

#4 楼 @wuwx 你这个如果 sum 是浮点数的话,rescue 不起作用的

#8 楼 @fresh_fish 如果 sum 能有数值的话,说明 list.length 就不能为 0 啦

#7 楼 @wuwx 嗯,意思是你可以用 try 处理空数组,加个 return 就可以了

@wuwx 你的 rescue 这个版本就挺好的;不过最好要保证 list 是一个 array 吧

list.sum / [1, list.length].max

@diudiutang 看着蛋都碎了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号