[ruby-list:50247] Re: Hash.new([])の挙動について

From: Masahiro Utsumi <utsumi@...>
Date: 2015-10-27 10:02:24 UTC
List: ruby-list #50247
内海と申します。

こう言う集計方法、よく使います。
クラスにしてしまうのはいかがでしょうか。

class AutoHash

   def initialize
     @data = {}
   end

   def [](key)
     @data[key] = [] unless @data[key]
     @data[key]
   end

   def []= (key, value)
     if value.class == Array
       @data[key] = value
     else
       @data[key] = [value]
     end
   end

   def method_missing(name, *args)
     if (block_given?)
       return nil
     else
       return @data[name.to_s]
     end
   end

end

if (__FILE__ == $0)
   h = AutoHash.new

   p h['key1']  # []
   h['key1'] << 1  # [1]
   h['key2'] << 'A' # ['A']
   h['key1'] << 2  # [1,2]
   p h['key1']
   p h['key2']
   p h.key2
   h['key1'] = 'B' # ['B']
   p h.key1
end



On 2015/10/27 4:57, Kunimi Ikeda wrote:
> いけだと申します。
>
> 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としては想定通りの動きなのでしょうか?
>

In This Thread