0

バインディングと共にパラメーターを渡す以外に、渡されたオブジェクトをブロック/メソッド内で変更して、変更を初期オブジェクトに反映させる方法はありますか?

要件が次のものを変換することであると想像してください。

{one:1, two:2, three:3, four:4}の中へ{one:"1", two:"22", three:"333", four:"4444"}

私は次のようなことを考えていました:

{one:1, two:2, three:3, four:4}.each!{ |k,v| v = v.to_s * v }

渡された変数への変更が実際のハッシュに反映される場所。

このような能力を持つことは効率的かもしれないと思いますか?そのため、ブロックは、新しいオブジェクトを作成してから割り当てることなく、これらのオブジェクトを直接操作できます。

このような問題を解決するには、オブジェクトのデータ型の複数の不要な変更が必要であり、非効率的である可能性があります。

new_hash = Hash[{one:1, two:2, three:3, four:4}.collect{ |k,v| [k, v.to_s * v] }]

それぞれに似たものがあるのか​​なと思っていたので!それをするために。

4

1 に答える 1

2

のようなものは知りませんがeach!、これはあなたがやろうとしていることを達成するはずです:

test = {one:1, two:2, three:3, four:4}

test.each{ |key,val| test[key] = val.to_s * val }

p test

#=> {:one=>"1", :two=>"22", :three=>"333", :four=>"4444"}
于 2013-11-04T01:50:34.457 に答える