Ruby哈希值遍历和更改值不起作用

时间:2011-06-16 11:25:52

标签: ruby-on-rails ruby ruby-on-rails-3

a = {"a" => 100, "b" => 200, "c" => 300}

b = a.map{|k,v| v = v + 10}

返回一个数组,我需要通过引用

来调整哈希值

我期待以下输出

{"a" => 110, "b" => 210, "c" => 310}

由于

6 个答案:

答案 0 :(得分:8)

这是我的非变异单行:P

Hash[original_hash.map { |k,v| [k, v+10] }]

爱红宝石单行:)

答案 1 :(得分:6)

也许你可以这样做:

a.keys.each do |key| a[key] += 10 end

答案 2 :(得分:4)

a.each_pair do |x,y| a[x] += 10 end

答案 3 :(得分:4)

现实检查:

require "benchmark"
include Benchmark

h0, h1, h2, h3, h4 = (0..4).map { Hash[(0..1000).map{ |i| [i,i] }] }

bm do |x|
  x.report("0") { 1000.times { h0.each_key{ |k| h0[k] += 10 } } }
  x.report("1") { 1000.times { h1.keys.each{ |k| h1[k] += 10 } } }
  x.report("2") { 1000.times { Hash[h2.map { |k,v| [k, v+10] }] } }
  x.report("3") { 1000.times { h3.inject({}){ |h,(k,v)| h[k] = v + 10; h } } }
  x.report("4") { 1000.times { h4.inject({}){ |h,(k,v)| h.update( k => v + 10) } } }
end

      user     system      total        real
0  0.490000   0.000000   0.490000 (  0.540795)
1  0.490000   0.010000   0.500000 (  0.545050)
2  1.210000   0.010000   1.220000 (  1.388739)
3  1.570000   0.010000   1.580000 (  1.660317)
4  2.460000   0.010000   2.470000 (  3.057287)

命令式编程获胜。

答案 4 :(得分:1)

Dude用map更改each,你很高兴:)

答案 5 :(得分:1)

我相信应该提出每个Ruby问题inject:D

b = a.inject({}){ |h,(k,v)| h[k] = v + 10; h }
#=> {"a"=>110, "b"=>210, "c"=>310}