13

キーが文字列で、値が文字列の配列であるハッシュが 1 つあります。私はこのようなものが欲しい:

{"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]} 

これを実装するためのハッシュと配列は 1 つだけです。私はこのようなものをコーディングしました:

hash1 = Hash.new
arr = Array.new
arr.push "v1"
arr.push "v2"
hash1["k1"] = arr 

#hash is like this: {"k1"=>["v1", "v2"]
#Now I clear the array to read the new values

arr. clear
arr.push "v3"
arr.push "v4"
hash1["k2"] = arr
puts hash1

#Output: {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]}
#Notice that k1's value also got updated

次に、1行を変更しました。

hash1 = Hash.new
arr = Array.new
arr.push "v1"
arr.push "v2"
hash1["k1"] = arr 

arr = [] # ** This is the only changed line.  Now k1's value is correct. **
arr.push "v3"
arr.push "v4"
hash1["k2"] = arr
puts hash1
#Output: {"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]} (which I wanted)

誰かが私にこれがどのように起こるか説明してもらえますか? 私はRubyにとても慣れていません。理想的には、この問題をコーディングする正しい方法は何ですか?

4

2 に答える 2

14

これは、何が起こっているかを示しているはずです(object_idあなたの友達です)。(違いを見やすくするために、Object_id にアンダースコアを挿入しました。)

hash1 = {}            # => {} 
arr = ["v1", "v2"]    # => ["v1", "v2"] 
arr.object_id         # => 7016637_4343580 
hash1["k1"] = arr     # => ["v1", "v2"] 
hash1                 # => {"k1"=>["v1", "v2"]}
hash1["k1"].object_id # => 7016637_4343580 
arr.clear             # => [] 
arr.object_id         # => 7016637_4343580 
arr << "v3" << "v4"   # => ["v3", "v4"] 
arr.object_id         # => 7016637_4343580 
hash1["k2"] = arr     # => ["v3", "v4"] 
hash1                 # => {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]} 
hash1["k1"].object_id # => 7016637_4343580 
hash1["k2"].object_id # => 7016637_4166580 

arr = []              # => [] 
arr.object_id         # => 7016637_4036500 
arr = ["v5", "v6"]    # => ["v5", "v6"] 
arr.object_id         # => 7016637_3989880 
hash1                 # => {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]} 
hash1["k1"].object_id # => 7016637_4343580 
hash1["k2"] = arr     # => ["v5", "v6"] 
hash1                 # => {"k1"=>["v3", "v4"], "k2"=>["v5", "v6"]} 
hash1["k1"].object_id # => 7016637_4343580 
hash1["k2"].object_id # => 7016637_3989880 
于 2013-09-27T19:40:35.720 に答える
3

ハッシュに保存した配列は引き続き参照されてarrいるため、明確に実行arr.clearおよび使用arr.pushすると、クリーンアップされ、ハッシュに保存された配列にも新しい値が追加されます。ただしarr = []、を実行arrすると、ハッシュに保存されたものとは異なる新しい配列が参照されるようになります。

そして、ハッシュする新しい配列を簡単に追加できます。

hash1["k2"] = ["v3", "v4"]

または

hash1["k2"] = %w[v3 v4]
于 2013-09-27T18:50:10.967 に答える