4

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

=> person["some_guy"] = {:hobby => "biking", :age => 30}

我将如何为哈希“人”指定默认值?我尝试了以下

=> person.default = {:hobby => "none", :age => 20}

但它不起作用。

编辑:

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

=> person["dude"][:age] += 5

这就是我所看到的

=> person["dude"]
=> {:hobby => "none", :age => 25}

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

=> person
=> {}

然而,我所期待的是

=> person
=> {"dude" => {:hobby => "none", :age => 25}}
4

3 回答 3

7

为什么它可能不适合你

如果对象没有该方法,则不能调用 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}

你可能想要什么

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

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}}
于 2012-06-06T00:15:39.913 回答
2

您可以通过将默认值传递给.new方法,在实例化时指定哈希的默认值:

person = Hash.new({ :hobby => '', :age => 0 })
于 2012-06-05T23:38:07.970 回答
0

您可以使用Hash#default_proc动态初始化具有默认值的哈希。

h = Hash.new
h.default_proc = proc 做 |散列,键|
  hash[key] = Hash.new(0) 除非 hash.include? 钥匙
结尾
h[0][0] # => 0
h[1][0] # => 0
h[0][0] = 1
h[0][0] # => 1
h[1][0] # => 0
于 2016-02-19T11:34:20.460 回答