Ruby IRB(显然)没有正确地检查散列

Ruby IRB(显然)没有正确地检查散列,ruby,hash,irb,Ruby,Hash,Irb,我在IRB1.8.7中看到了一些关于打印哈希的奇怪行为。如果使用散列.new初始化散列,则我的散列似乎正在“计算”为空散列: irb(main):024:0> h = Hash.new([]) => {} irb(main):025:0> h["test"] => [] irb(main):026:0> h["test"] << "blah"

我在IRB1.8.7中看到了一些关于打印哈希的奇怪行为。如果使用
散列.new
初始化散列,则我的散列似乎正在“计算”为空散列:

irb(main):024:0> h = Hash.new([])
=> {}
irb(main):025:0> h["test"]
=> []                                                        
irb(main):026:0> h["test"] << "blah"                    
=> ["blah"]                                         
irb(main):027:0> h                              
=> {}                                                  
irb(main):028:0> puts h.inspect                       
{}                                                               
=> nil                 
irb(main):031:0> require 'pp'     
=> true                           
irb(main):032:0> pp h             
{}                                
=> nil                            
irb(main):033:0> h["test"]
=> ["blah"]

看起来您正在尝试创建数组的散列。为此,我建议您进行如下初始化:

h = Hash.new { |h,k| h[k] = [] }
你的版本也不适合我。原因有点复杂

如果指定了obj,则此单个对象将用于所有默认值

我加上了粗体字。其余的重点是原样


您正在指定
obj
[]
,并且它只是一个默认值。实际上,它不会将散列的内容设置为默认值。因此,当您执行
h[“blah”]时,看起来您正在尝试创建数组的散列。为此,我建议您进行如下初始化:

h = Hash.new { |h,k| h[k] = [] }
你的版本也不适合我。原因有点复杂

如果指定了obj,则此单个对象将用于所有默认值

我加上了粗体字。其余的重点是原样


您正在指定
obj
[]
,并且它只是一个默认值。实际上,它不会将散列的内容设置为默认值。因此,当您执行
h[“blah”]时,这里的问题是调用
h[“test”]
实际上并不会在哈希中插入新的键-它只返回默认值,即传递给
hash.new
的数组

1.8.7 :010 > a = []
 => []
1.8.7 :011 > a.object_id
 => 70338238506580
1.8.7 :012 > h = Hash.new(a)
 => {}
1.8.7 :013 > h["test"].object_id
 => 70338238506580
1.8.7 :014 > h["test"] << "blah"
 => ["blah"]
1.8.7 :015 > h.keys
 => []
1.8.7 :016 > h["bogus"]
 => ["blah"]
1.8.7 :017 > h["bogus"].object_id
 => 70338238506580
1.8.7 :019 > a
 => ["blah"]
1.8.7:010>a=[]
=> []
1.8.7:011>a.object\u id
=> 70338238506580
1.8.7:012>h=Hash.new(a)
=> {}
1.8.7:013>h[“测试”]。对象id
=> 70338238506580
1.8.7:014>h[“测试”][“废话”]
1.8.7:015>h键
=> []
1.8.7:016>h[“伪”]
=>[“废话”]
1.8.7:017>h[“伪”]。对象id
=> 70338238506580
1.8.7:019>a
=>[“废话”]

散列本身仍然为空-您尚未为其分配任何内容。数据不存在于散列中-它存在于因散列中缺少键而返回的数组中。

这里的问题是调用
h[“test”]
实际上并没有将新键插入散列中-它只返回默认值,即传递给
散列的数组。new

1.8.7 :010 > a = []
 => []
1.8.7 :011 > a.object_id
 => 70338238506580
1.8.7 :012 > h = Hash.new(a)
 => {}
1.8.7 :013 > h["test"].object_id
 => 70338238506580
1.8.7 :014 > h["test"] << "blah"
 => ["blah"]
1.8.7 :015 > h.keys
 => []
1.8.7 :016 > h["bogus"]
 => ["blah"]
1.8.7 :017 > h["bogus"].object_id
 => 70338238506580
1.8.7 :019 > a
 => ["blah"]
1.8.7:010>a=[]
=> []
1.8.7:011>a.object\u id
=> 70338238506580
1.8.7:012>h=Hash.new(a)
=> {}
1.8.7:013>h[“测试”]。对象id
=> 70338238506580
1.8.7:014>h[“测试”][“废话”]
1.8.7:015>h键
=> []
1.8.7:016>h[“伪”]
=>[“废话”]
1.8.7:017>h[“伪”]。对象id
=> 70338238506580
1.8.7:019>a
=>[“废话”]
散列本身仍然为空-您尚未为其分配任何内容。数据不存在于散列中-它存在于为散列中缺少键而返回的数组中