因此,我想创建一个散列,其中任何键都成为数组,而不必单独声明它们。
因此,我使用
foo = Hash.new([])
=> {}
然后我可以向以前未声明的密钥添加项目
foo[:bar] << 'Item 1'
=> ['Item 1']
这样做有点奇怪。当我呼叫时
foo
=> {}
若要查看哈希,它是空的。甚至运行
foo.keys
=> []
显示它是空的。但是,如果我运行
foo[:bar]
=> ['Item 1']
请让它有意义。
foo = Hash.new([])
将不存在键的默认值设置为数组。这里的foo[:bar] << 'Item 1'
和:bar
键不存在,所以foo
使用一个数组来添加新元素。通过这样做,您可以更改默认值,因为数组是通过引用提供给您的。
> foo = Hash.new([])
=> {}
> foo.default
=> []
如果你在散列中调用任何未定义的密钥,你会得到这个数组:
> foo[:bar] << 'Item 1'
=> ["Item 1"]
> foo[:foo]
=> ["Item 1"]
为了实现您的目标,您应该每次返回一个新数组。通过将一个块传递给Hash.new
,可以在每次访问未定义的密钥时执行该块:
> foo = Hash.new { |hash, key| hash[key] = [] }
=> {}
> foo[:bar] << 'Item 1'
=> ["Item 1"]
> foo[:bar]
=> ["Item 1"]
> foo.keys
=> [:bar]
> foo[:foo]
=> []
> foo[:foo] << 'Item 2'
=> ["Item 2"]
> foo
=> {:bar=>["Item 1"], :foo=>["Item 2"]}
这是文件。