[ruby-list:50245] Re: Hash.new([])の挙動について
From:
rubikitch@...
Date:
2015-10-27 04:48:08 UTC
List:
ruby-list #50245
From: Kunimi Ikeda <kunimi.ikeda@gmail.com>
Subject: [ruby-list:50240] Hash.new([])の挙動について
Date: Tue, 27 Oct 2015 12:57:38 +0900
るびきちです。
> aの値が私の想定とは反して {} になります。
> 想定は{"key"=>[1, 2, 3]} です。
> a['key']の値は想定通り[1, 2, 3]となっています。
他の人の言うように、これは仕様です。
このコードはデフォルト値を更新します。
「<<」は破壊的メソッドなのでオブジェクトそのものを書き換えます。
a = Hash.new([])
a['key'] << 1 # => [1]
a['key'] << 2 # => [1, 2]
a['key'] << 3 # => [1, 2, 3]
a # => {}
a.default # => [1, 2, 3]
想定通りの結果を得るいくつかのパターンを紹介しておきます。
# a['key']が偽ならば配列を作成して設定する
# 真ならばその配列に追加する
a = {}
(a['key']||=[]) << 1 # => [1]
(a['key']||=[]) << 2 # => [1, 2]
(a['key']||=[]) << 3 # => [1, 2, 3]
a # => {"key"=>[1, 2, 3]}
# a['key']を明示的に設定する
a = {}
a['key'] = []
a['key'] << 1 # => [1]
a['key'] << 2 # => [1, 2]
a['key'] << 3 # => [1, 2, 3]
a # => {"key"=>[1, 2, 3]}
# a_keyという一時変数を媒介する
a = {}
a_key = []
a_key << 1 # => [1]
a_key << 2 # => [1, 2]
a_key << 3 # => [1, 2, 3]
a['key'] = a_key
a # => {"key"=>[1, 2, 3]}
--
rubikitch http://rubikitch.com/