在 Ruby 中为散列的散列指定默认值

ksh*_*noy 3 ruby

假设我有一个名为 person 的哈希,其键是名称,值是具有键“年龄”和“爱好”的哈希。散列人员中的条目看起来像

=> person["some_guy"] = {:hobby => "biking", :age => 30}
Run Code Online (Sandbox Code Playgroud)

我将如何指定散列“人”的默认值?我尝试了以下

=> person.default = {:hobby => "none", :age => 20}
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

编辑:

我正在设置一个属性,并希望自动填充其他属性。例如。

=> person["dude"][:age] += 5
Run Code Online (Sandbox Code Playgroud)

这就是我所看到的

=> person["dude"]
=> {:hobby => "none", :age => 25}
Run Code Online (Sandbox Code Playgroud)

这很好。但是,person在提示符下键入,我得到一个空的哈希值。

=> person
=> {}
Run Code Online (Sandbox Code Playgroud)

然而,我所期待的是

=> person
=> {"dude" => {:hobby => "none", :age => 25}}
Run Code Online (Sandbox Code Playgroud)

Tod*_*obs 6

为什么它可能不适合你

如果对象没有该方法,则不能调用 Hash#default。person.is_a? Hash在它起作用之前,您需要确保它。你确定你没有数组吗?

还值得注意的是,散列默认值不会填充任何内容;它只是缺少键时返回的值。如果您创建了一个键,那么您仍然需要填充该值。

为什么它对我有用

# Pass a default to the constructor method.
person = Hash.new({hobby: "", age: 0})
person[:foo]
=> {:hobby=>"", :age=>0}

# Assign a hash literal, and then call the #default method on it.
person = {}
person.default = {hobby: "", age: 0}
person[:foo]
=> {:hobby=>"", :age=>0}
Run Code Online (Sandbox Code Playgroud)

你可能想要的

由于哈希默认值仅适用于缺少的键,而不适用于缺少的值,因此如果要填充哈希的哈希,则需要采用不同的方法。一种方法是将块传递给哈希构造函数。例如:

person = Hash.new {|hash,key| hash[key]={hobby: nil, age:0}}
=> {}

person[:foo]
=> {:hobby=>nil, :age=>0}

person[:bar]
=> {:hobby=>nil, :age=>0}

person
=> {:foo=>{:hobby=>nil, :age=>0}, :bar=>{:hobby=>nil, :age=>0}}
Run Code Online (Sandbox Code Playgroud)