shonen.hateblo.jp

やったこと,しらべたことを書く.

文字列・シンボルからクラスインスタンスを取得する

こういうコードがあるとする。

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