在Ruby中为散列哈希值指定默认值

时间:2012-06-05 23:29:18

标签: ruby

假设我有一个称为人的Hash,其键是名称,值是具有键'age'和'hobby'的哈希。哈希人中的条目看起来像

=> 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}}

3 个答案:

答案 0 :(得分:4)

为什么它可能不适合你

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

答案 1 :(得分:1)

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

person = Hash.new({ :hobby => '', :age => 0 })

答案 2 :(得分:0)

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

h = Hash.new
h.default_proc = proc do |hash, key|
  hash[key] = Hash.new(0) unless hash.include? key
end
h[0][0] # => 0
h[1][0] # => 0
h[0][0] = 1
h[0][0] # => 1
h[1][0] # => 0