【问题标题】:refactoring ruby method重构ruby方法
【发布时间】:2011-07-05 08:06:08
【问题描述】:

这是一个简单的问题...

这个方法可以重构吗?

def sum
  total = 0
  [1,2,3,4].each do |num|
    total += num
  end
  total
end

感谢您的帮助!

【问题讨论】:

  • 您要求重构和/或改进现有代码的建议的问题比 stackoverflow 更适合新的code review stackexchange site。考虑将来在那里问类似的问题。谢谢。

标签: ruby loops refactoring


【解决方案1】:
>> [1, 2, 3, 4].inject(0) { |acc, x| acc + x }
=> 10

或者简单地说:

>> [1, 2, 3, 4].inject(0, :+)
=> 10

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      你可以用这个:

      [1,2,3,4].inject(0, :+) # => 10
      

      【讨论】:

      • [].inject(:+) 将返回 nil。那有什么问题?为什么我们需要0 而不是nil
      • a) 因为它是 OP 代码所做的,b) 因为根据我读过的任何定义,空集的总和为 0,并且 c) 你不能在 nil 上做算术所以返回值 nil 是没有用的。
      • 详细说明 c 点:如果items_bought 为空,我希望balance - sum(items_bought.map(&:price)) 之类的东西评估为balance,而不是引发异常。
      【解决方案4】:
      [1,2,3,4].inject { |total,num| total= total+num }
      

      或者按照下面的建议应该是

      [1,2,3,4].inject(0) { |total,num| total+num }
      

      【讨论】:

      • a = a+b 中的赋值是不必要且具有误导性的。它应该只是a+b。也相当于他的代码应该是inject(0)(否则空数组的结果是不同的)。
      • 根据您的建议更新了答案。谢谢!!
      猜你喜欢
      • 2011-04-24
      • 2013-12-08
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      相关资源
      最近更新 更多