Ruby

Hashのキーをメソッド名にして要素を取得する

More than 1 year has passed since last update.

Hashの要素に、Structのようにメソッドでアクセスしたいと思いました。

h = {"a" => 1}
h["a"]  #=> 1
#普通はできないけどこうしたい
h.a  #=> 1

方法1

みんな大好きmethod_missingを使う方法

def h.method_missing(name, *args)
  name_s = name.to_s
  if self.has_key?(name_s)
    self[name_s]
  else
    super
  end
end

メリット:後から要素を追加しても対応できる
デメリット:キーに文字列とシンボルが混在してたりするとちょっと面倒くさい、そもそもmethod_missingとか使うべきじゃない

方法2

Object#define_singleton_methodを使う

h.each_key {|k| h.define_singleton_method(k) {h[k]}}

メリット:method_missingを使わない、キーが文字列でもシンボルでも同じ書き方ができる、わりと簡潔に書ける
デメリット:要素を追加するたびにメソッドを定義しないといけない

結論

後から要素を追加するかどうかでどちらを使うか決めるのが良いんじゃないでしょうか。

他にもこんなやり方あるよという方はぜひ教えてください!