Ruby重构哈希循环方法返回

mah*_*ich 1 ruby hash ruby-on-rails

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

  def totals
    t = 0
    @data.each do |k, v|
      t += v['totals'].to_i
    end
    t
  end
Run Code Online (Sandbox Code Playgroud)

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

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

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

更新:

数据结构如下:

{ typeA: { items: [], totals: "10" },  typeB: { items: [], totals: "23" }}
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*oss 5

既然您已经表明使用的是Ruby on Rails,那么您可以利用Active Support的Enumerable#sum方法:

def totals
  @data.sum {|_,v| v['totals'].to_i }
end
Run Code Online (Sandbox Code Playgroud)

  • 它实际上比"通常"更多,实际上甚至有一些内置于语言中的知识:未使用的局部变量触发警告,但对于以`_`开头的变量,此警告被抑制.此外,如果名称为_ _`表示警告被抑制,则使用相同的变量多次作为赋值的参数或目标可能会生成警告. (5认同)
  • @mahatmanich yeap,在块中你对未使用的变量使用`_`表示法 (2认同)