作者:手机用户2502937497 | 来源:互联网 | 2023-05-24 12:01
我想Hash
用空的初始化a Array
和每个新的键将一个值推送到该数组.
这是我试图做的事情:
a = Hash.new([])
# => {}
a[1] <<"asd"
# => ["asd"]
a
# => {}
预期的产出a
是,{1 => ["asd"]}
但没有发生.我在这里错过了什么?
Ruby版本:
ruby 2.0.0p598 (2014-11-13 revision 48408) [x86_64-linux]
Arup Rakshit..
9
做就是了
a = Hash.new { |h, k| h[k] = [] }
a[1] <<"asd"
a # => {1=>["asd"]}
请阅读Hash::new
文档中的以下行.这真的解释了为什么你没有得到理想的结果.
new(obj)→new_hash
如果指定了obj,则此单个对象将用于所有默认值.
new {| hash,key | 阻止}→new_hash
如果指定了一个块,它将使用哈希对象和键调用,并应返回默认值.如果需要,块负责将值存储在哈希中.
你可以手工测试:
a = Hash.new([])
a[1].object_id # => 2160424560
a[2].object_id # => 2160424560
现在使用上述Hash
对象创建方式,您可以看到对未知键的每次访问,返回相同的默认对象.现在反过来,我的意思是块方式:
b = Hash.new { |h, k| [] }
b[2].object_id # => 2168989980
b[1].object_id # => 2168933180
因此,使用块形式,每个未知密钥访问,返回一个新Array
对象.
1> Arup Rakshit..:
做就是了
a = Hash.new { |h, k| h[k] = [] }
a[1] <<"asd"
a # => {1=>["asd"]}
请阅读Hash::new
文档中的以下行.这真的解释了为什么你没有得到理想的结果.
new(obj)→new_hash
如果指定了obj,则此单个对象将用于所有默认值.
new {| hash,key | 阻止}→new_hash
如果指定了一个块,它将使用哈希对象和键调用,并应返回默认值.如果需要,块负责将值存储在哈希中.
你可以手工测试:
a = Hash.new([])
a[1].object_id # => 2160424560
a[2].object_id # => 2160424560
现在使用上述Hash
对象创建方式,您可以看到对未知键的每次访问,返回相同的默认对象.现在反过来,我的意思是块方式:
b = Hash.new { |h, k| [] }
b[2].object_id # => 2168989980
b[1].object_id # => 2168933180
因此,使用块形式,每个未知密钥访问,返回一个新Array
对象.