2016-08-29 7 views
3

ハッシュがあり、値またはキーの1つを更新したい場合は、簡単にを使用できます。次.updateを使用して値を更新する

def foo(params) 
    params+=1 
end 

hsh = {:a=>1,:b=>2,:c=>3} 

hsh.update(hsh) do |key,oldVal| 
    foo(oldVal) 
end 

p hsh 

ようupdate方法は、しかし新しいhashと仮定し、私は別のhashにそのプロパティをコピーして、値に1を追加したいです。どのように私はこれを正確に行うだろうか?ここに私の試みです

def foo(params) 
    params+=1 
end 
new_hsh = {:a=>1,:b=>2,:c=>3} 
hsh = {} 
hsh.update(new_hsh) do |key,value,newVal| 
    newVal = foo(value) 
end 

p hsh 

出力は{:a=>1,:b=>2,:c=>3}です。したがって、new_hshをコピーしていますが、valueは更新していません。ドキュメント

によれば

はHSHにother_hashの内容を追加します。ブロックが指定されていない場合、重複キーを持つエントリはother_hashの値で上書きされます。そうでない場合は、キーを持つブロック、hshの値、other_hashの値を呼び出して重複キーの値を決定します。

ドキュメントのようにコピーしていますが、どうすれば更新できますか?

おかげ

EDIT

はいけない3つのパラメータを渡す

def foo(params) 
    params+=1 
end 
new_hsh = {:a=>1,:b=>2,:c=>3} 
hsh = {} 
hsh.update(new_hsh) do |key,value,newVal| 
    foo(newVal) 
end 

p hsh 
+0

最初のスニペットでは、値の1つを更新していません。あなたはそれらの__all__を更新しています。 –

+0

はい、申し訳ありません、それは私がやりたいことです。 – bill

+0

@SergioTulentsev、編集したスニペットがうまくいかない理由は知っていますか?もちろん – bill

答えて

1

これは別の答えです。これは動作しますが、new_hshも変更します。しかし、hshでupdateを呼び出す前に、hsh = new_hshを設定する必要があります。

def foo(params) 
params+=1 
end 

new_hsh = {:a=>1,:b=>2,:c=>3} 
hsh = new_hsh 
hsh.update(hsh) do |key,value| 
    hsh[key] = foo(value) 
end 

p hsh 
+0

笑これは不正行為のように感じるが、それは動作します! – bill

+0

これも 'new_hsh'を更新します、btw –

+0

私がトップで言ったことですね。 – Robert

1

を試みました。このように2を渡すだけです。 new_hshの各キー、値ペアを繰り返し、fooメソッドに渡された後に新しい値と等しい値に設定し、hshに押し込みます。

def foo(params) 
params+=1 
end 
new_hsh = {:a=>1,:b=>2,:c=>3} 
hsh = {} 
new_hsh.each do |key,value| 
    hsh[key] = foo(value) 
end 

p hsh 
+0

これは本当にうまくいくのですが、どうやって '.update'を使って実装していますか? – bill

+0

この質問をお試しください。http://stackoverflow.com/questions/5215713/ruby-what-is-the-easiest-method-to-update-hash-values – Velocibadgery

+0

私の動作例は、その質問の中で提案されているものと同じです。私は新しいハッシュに関して 'update'でこれを行うことができるかどうかを知りたかっただけです。そうする方法はありますか? – bill

関連する問題