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
を使わない、キーが文字列でもシンボルでも同じ書き方ができる、わりと簡潔に書ける
デメリット:要素を追加するたびにメソッドを定義しないといけない
結論
後から要素を追加するかどうかでどちらを使うか決めるのが良いんじゃないでしょうか。
他にもこんなやり方あるよという方はぜひ教えてください!