Ruby IRB(显然)没有正确地检查散列
我在IRB1.8.7中看到了一些关于打印哈希的奇怪行为。如果使用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"
散列.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
=>[“废话”]
散列本身仍然为空-您尚未为其分配任何内容。数据不存在于散列中-它存在于为散列中缺少键而返回的数组中