उपयोग Enumerable#reduce
, यदि आप nil
हो रही के साथ ठीक कर रहे हैं हैश होने वाला खाली:
H.values.reduce(:+) # => 3
Hash.new.values.reduce(:+) # => nil
0
सुरक्षित रूप से प्राप्त करने के लिए जब हैश खाली, इस्तेमाल होता है:
H.values.reduce(0) { |sum,x| sum + x } # or...
H.reduce(0) { |sum,(key,val)| sum + val } # ...if you need to inspect the key
यहाँ किक के लिए, एक त्वरित बेंचमार्क है। ध्यान दें कि यह थोड़ा तेज हो गया लगता है कुंजी/मान जोड़े से मूल्यों के बजाय सिर्फ मूल्यों को कम करने:
user system total real
H.values.reduce(:+) 4.510000 0.080000 4.590000 ( 4.595229)
H.values.reduce(0) {...} 4.660000 0.080000 4.740000 ( 4.739708)
H.reduce(0) {...} 5.160000 0.070000 5.230000 ( 5.241916)
require 'benchmark'
size = 1_000
hash = Hash[* Array.new(size*2) { rand } ]
N=10_000
Benchmark.bm(24) do |x|
x.report('H.values.reduce(:+)') { N.times { hash.dup.values.reduce(:+) } }
x.report('H.values.reduce(0) {...}') { N.times { hash.dup.values.reduce(0) { |sum,x| sum + x } } }
x.report('H.reduce(0) {...}') { N.times { hash.dup.reduce(0) { |sum,(_,v)| sum + v } } }
end
कोशिश करें: एच .values.reduce (: +) –
धन्यवाद! जिसने चाल – richsoni