a = {"a" => 100, "b" => 200, "c" => 300}
b = a.map{|k,v| v = v + 10}
返回一个数组,我需要通过引用
来调整哈希值我期待以下输出
{"a" => 110, "b" => 210, "c" => 310}
由于
答案 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}