[ruby-list:50243] Re: Hash.new([])の挙動について
From:
小栁真太 <yancya@...>
Date:
2015-10-27 04:23:20 UTC
List:
ruby-list #50243
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 <kunimi.ikeda@gmail.com>:
> いけだと申します。
>
> 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
:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-: