From: "小栁真太" Date: 2015-10-27T13:23:20+09:00 Subject: [ruby-list:50243] Re: Hash.new([])の挙動について yancya と申します その状態だと、 p a["key"] => [1, 2, 3] p a["hoge"] => [1, 2, 3] となることからわかるように、a.send(:[], any_key) の any_key が何であれ、最初の Hash.new([]) でデフォルトに指定した Array インスタンスを返します そして、(a.send(:[], any_key)) << any_object と解釈されるため、デフォルトの Array インスタンスにオブジェクトが追加されるだけで、Hash 自体には key も value も追加されないというのが真相であり、想定通りの動きなのではないかなと思います 2015-10-27 12:57 GMT+09:00 Kunimi Ikeda : > いけだと申します。 > > a = {} > a['key'] = [] unless a['key'] > a['key'] << 1 > a['key'] << 2 > a['key'] << 3 > > を簡単に書けないかと思い、 > > a = Hash.new([]) > a['key'] << 1 > a['key'] << 2 > a['key'] << 3 > > と書いてみました。 > > すると実行はできましたが、どうも納得がいかない挙動になります。 > > > irb(main):001:0> RUBY_VERSION > => "2.2.3" > irb(main):002:0> a = Hash.new([]) > => {} > irb(main):003:0> a['key'] << 1 > => [1] > irb(main):004:0> a['key'] << 2 > => [1, 2] > irb(main):005:0> a['key'] << 3 > => [1, 2, 3] > irb(main):006:0> a > => {} > > > aの値が私の想定とは反して {} になります。 > 想定は{"key"=>[1, 2, 3]} です。 > a['key']の値は想定通り[1, 2, 3]となっています。 > > > これはRubyとしては想定通りの動きなのでしょうか? > -- :-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-: 小栁 真太 yancya@upec.jp :-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-: