2016-02-04 87 views
1

我有這樣的代碼這樣(我經常碰到這種方法簽名,那我從Java未來的小白):紅寶石重構散列循環方法的返回

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

@data是哈希散列,每個內部散列值都有一個totals密鑰。正如你所看到的,我總結了所有的總數。

這可以用不同的風格進行簡化或編程(我相信!這是RUBY的後續)?爲什麼我需要實例化t?我不能直接從每個循環返回t而沒有最後的條件嗎?

它只是不覺得乾淨! 哦等一下!我只記得塊,但我會等你的答案...

UPDATE:

的數據結構是這樣:

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

我使用Rails!因此,如果Rails的特殊功能超越了Ruby的紅色堆棧,那麼它們也將非常棒!

回答

5

不同的,因爲你已經表明,你正在使用Ruby on Rails的,你可以利用Active支持的Enumerable#sum方法:

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

接受更好的API參考,並提及Nermin的ActiveSupport,它的速度提高了6秒!強硬的呼喚! – mahatmanich

+0

什麼是'| _,v |',這是哈希的一些約定,但沒有使用密鑰? – mahatmanich

+2

@mahatmanich對於未使用的變量,在塊中使用'_'表示法 –

4

使用inject

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

甚至更​​短:

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

似乎不起作用。它是哈希散列{類型:{項目:[],總數:XYX}} – mahatmanich

+0

@mahatmanich好的,我的誤解。編輯答案相應 –

+1

不要忘記建議使用'reduce'的別名''' – lx00st

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 
+2

官方文檔可以在http://api.rubyonrails.org/classes/Enumerable.html#method-i-sum – Stefan

+0

找到。有沒有必要「**編輯:**」。此外,我不認爲編輯的主題確實增加了有用的東西。簡單地提供文檔的參考資料 - 涵蓋了這一點,並且本身是有用的 - 就足夠了。 –

4

在Rails 5,你可以採取的一些優勢Enumerable#pluck

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

還沒有,但謝謝你的見解! – mahatmanich

+1

缺點是,這會創建三個臨時陣列,但是它的讀數非常好,通過多個簡單的步驟便於測試。在我看來,如果'h'不大,這種方法有很多優點。 –

+0

不知道你可以使用'pluck'與其他對象,即AR。很好,+1 –