假设我有一个称为人的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}}
答案 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