运行Hash.new([])可以达到预期效果,但不能达到预期效果



因此,我想创建一个散列,其中任何键都成为数组,而不必单独声明它们。

因此,我使用

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"]}

这是文件。

最新更新