LoginSignup
0
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-17

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

結論

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

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

0
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2