[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/

In This Thread