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.keyhash.key=valuehash[:key], hash[:key]=valueシンタックスシュガーになります。
なお、キーとしてアクセスできるのは Symbol のみで文字列だとアクセスはできません(これは意図的
わざわざ gem に上げる必要あったの?というと微妙だけど、まぁ練習練習。
Rubymethod_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 って似て非なるものだしなんかもにょる。