Hash のキーの要素にメソッドでアクセスする
hash[:key]
を hash.key
という風にアクセスしたかったので、練習がてら雑に書いて gem にあげてみた。
install
$ gem install hash_with_key_access_method
使い方
# Using refinements using HashWithKeyAccessMethod hash = { name: :homu, "name2" => :mami} hash.name # to hash[:name] # => :homu # Failed String key access # hash.name2 # Assign new value hash.name = :mami # to hash[:name] = :mami hash.name # => :mami # Assign new key value hash.age = 13 # to hash[:age] = 13 hash.age # => 13 hash[:age] # => 13
hash.key
や hash.key=value
は hash[:key]
, hash[:key]=value
のシンタックスシュガーになります。
なお、キーとしてアクセスできるのは Symbol のみで文字列だとアクセスはできません(これは意図的
わざわざ gem に上げる必要あったの?というと微妙だけど、まぁ練習練習。
Ruby の method_missing
がガバガバ過ぎてこういうの考えているのが楽しい。
ちなみに refinements だと使えないんですが、include したモンキーパッチを require すれば、以下のようにシンボルブロックでアクセスする事ができます。
require "hash_with_key_access_method/included" hashs = [{name: :homu}, {name: :mami}, {name: :mado}] hashs.map &:name # => [:homu, :mami, :mado]
やりたいこととは関係ないけど
今回はあまり関係ないけど、ActiveSupport に with_indifferent_access ってのがあるらしい。
これを利用すると hash[:key]
と hash['key']
を等価に扱うようになるらしいけど、Symbol と String って似て非なるものだしなんかもにょる。