Ruby重构哈希循环方法返回

时间:2016-02-04 13:10:31

标签: ruby-on-rails ruby hash

我有这样的代码(我经常遇到这种方法签名,我来自java的noob):

  def totals
    t = 0
    @data.each do |k, v|
      t += v['totals'].to_i
    end
    t
  end

@data是哈希的哈希值,每个内部哈希值都有一个totals键。如你所见,我总结了所有的总数。

这可以简化或以不同的风格编程(我确定!这是RUBY毕竟)?为什么我需要实例化t?我没有直接从每个循环返回t而没有最后一个条件?

它感觉不干净! OH等!我只记得街区,但我会等你的答案......

更新:

数据结构如下:

{ typeA: { items: [], totals: "10" },  typeB: { items: [], totals: "23" }}

我正在使用Rails!因此,如果Rails特定的函数超出了vanilla Ruby堆栈,它们也会很棒!

5 个答案:

答案 0 :(得分:5)

由于您已经表明您使用的是Ruby on Rails,因此您可以利用Active Support的Enumerable#sum方法:

def totals
  @data.sum {|_,v| v['totals'].to_i }
end

答案 1 :(得分:4)

使用inject

def totals
  @data.inject(0) do |t, (_, v)|
    t + v['totals'].to_i
  end
end

答案 2 :(得分:4)

使用Enumerable sum

def totals
  @data.sum { |_,v| v['totals'].to_i }
end

您也可以使起始值与0

不同
def totals(start_value= 0)
  @data.sum(start_value) { |_,v| v['totals'].to_i }
end

答案 3 :(得分:4)

在Rails 5中,您可以利用Enumerable#pluck

h.values.pluck(:totals).map(&:to_i).sum

答案 4 :(得分:3)

@data.map{ |_, v| v['totals'].to_i }.inject(:+)

甚至更短:

@data.map{ |_, v| v['totals'].to_i }.sum