我有一个哈希,其中key是一个字符串,value是一个字符串数组.我想要这样的东西:
{"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]}
Run Code Online (Sandbox Code Playgroud)
我只有一个哈希和一个数组来实现这一点.我编写了这样的代码:
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
Run Code Online (Sandbox Code Playgroud)
然后我换了一行:
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)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这是怎么发生的吗?我是Ruby的新手.理想情况下,编码此问题的正确方法是什么?
Car*_*and 11
这应该会告诉你发生了什么(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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23228 次 |
| 最近记录: |