7

以下のコード例。ハッシュ値に対して append を呼び出すと正しく返されますが、ハッシュ自体は期待どおりに動作しません。

ruby-1.9.2-p290 :037 >   r = {}
 => {} 
ruby-1.9.2-p290 :038 > r.default = []
 => [] 
ruby-1.9.2-p290 :039 > r["c"] << 1
 => [1] 
ruby-1.9.2-p290 :040 > r["c"] 
 => [1] 
ruby-1.9.2-p290 :041 > r
 => {} 
ruby-1.9.2-p290 :042 > r.empty?
 => true 
4

2 に答える 2

8

ドキュメントからdefault=

ハッシュに存在しないキーに対して返される値であるデフォルト値を設定します。各キー ルックアップで実行される Proc にデフォルトを設定することはできません。

したがって、これを使用できます:

irb(main):037:0> h = Hash.new { |hash, key| hash[key] = [] }
=> {}
irb(main):038:0> h[1] << "2"
=> ["2"]
irb(main):039:0> h
=> {1=>["2"]}

また、 default_procを使用することもできます:

irb(main):047:0> h = {}
irb(main):047:0> h.default_proc =  proc {|hash, key| hash[key] = []}
=> #<Proc:0x23939a0@(irb):47> 
irb(main):049:0> h[1] << 3
=> [3]
irb(main):050:0> h
=> {1=>[3]}
于 2011-10-01T08:42:21.087 に答える
4

ruby hash がr.defaultany のデフォルト値として使用されているようですr[<unassigned-key>]。したがって、割り当てられていない別のキーを指定しても、単一の値が変更されます。下記を参照してください:

irb(main):001:0> r = {}
=> {}
irb(main):002:0> r.default = []
=> []
irb(main):003:0> r["c"] << 1
=> [1]
irb(main):004:0> r["c"]
=> [1]
irb(main):005:0> r["b"] << 2
=> [1, 2]
irb(main):006:0> r["b"]
=> [1, 2]
irb(main):007:0> r["c"]
=> [1, 2]
irb(main):010:0> r.default
=> [1, 2]
irb(main):008:0> r
=> {}
irb(main):009:0> r.empty?
=> true
于 2011-10-01T08:46:44.127 に答える