文字列・シンボルからクラスインスタンスを取得する
こういうコードがあるとする。
class Hoge def initialize puts 'init Hoge' end end c = Hoge c.new
c = Hoge
しているんだけれども、Hogeというのをコードに直接書くのではなく、
Hogeという文字列やシンボルからHogeクラスのインスタンスを取りたい。
eval 使えば済むんだけど、ちょっと抵抗あるよね。
sym = :Hoge c = eval(sym.to_s) c.new
Hoge がクラス名ではなく、ただの定数であることに気づくと、Module#const_get
を使えば良いことが分かる。
自身のクラスインスタンスを取得するメソッドは Object#class
だから、
sym = :Hoge c = class.const_get(sym) c.new
としたい所だけれども、classはキーワードなので、syntax errorとなる。 selfを噛ませると回避できた。
sym = :Hoge c = self.class.const_get(sym) c.new