如何用数组编组哈希?

Pas*_*cal 1 ruby serialization

我该怎么做来编组数组的哈希? 以下代码仅打印{}.

s = Hash.new
s.default = Array.new
s[0] << "Tigger"
s[7] << "Ruth"
s[7] << "Puuh"
data = Marshal.dump(s)
ls = Marshal.restore( data )
p ls
Run Code Online (Sandbox Code Playgroud)

如果散列不包含数组,则可以正确恢复.

ste*_*lag 7

s = Hash.new
s.default = Array.new
s[0] << "Tigger"
s[7] << "Ruth"
s[7] << "Puuh"
Run Code Online (Sandbox Code Playgroud)

此代码更改默认值3次(这可能是转储中显示的内容),但它不会在散列中存储任何内容.尝试"put s [8]",它将返回[["Tigger"],["Ruth"],["Puuh"]].

Hash.default_proc会做你想要的

s = Hash.new{|hash,key| hash[key]=[] }
Run Code Online (Sandbox Code Playgroud)

但你无法组织一个过程.这将有效:

s = Hash.new
s.default = Array.new
s[0] += ["Tigger"]
s[7] += ["Ruth"]
s[7] += ["Puuh"]
Run Code Online (Sandbox Code Playgroud)

这是因为[] + = ["Tigger"]创建一个数组.另一种方法是创建更少的数组:

s = Hash.new
(s[0] ||= []) << "Tigger"
(s[7] ||= []) << "Ruth"
(s[7] ||= []) << "Puuh"
Run Code Online (Sandbox Code Playgroud)

仅在密钥不存在时才创建新数组(nil).