QA@IT

Rubyで文字列をクラス名として扱うには?

20043 PV

Rubyで文字列 (あるいはシンボル) をクラス名として扱って、以下のようなこととはできますか?

klass = "user"
user = klass.capitalize.new(:name => 'foo')

回答

はい。できますよ。

Rails環境などでActiveSupportを使っているのであれば、以下のようにするのが確実です。

"user".classify.constantize.new(name: 'foo')

classify()で"user"を"User"にして、constantize()で定数にします。

そうでない場合、おっしゃっているように"capitalize"などでRubyのクラス(定数)にふさわしい形の文字列に変換した上で、Kernel.const_get()で取れます。

Object.const_get("user".capitalize)

ActiveSupportのものとの違いですが、前者は"::"による名前空間の区切りをまたいでクラスというか定数を取得できます。後者は、ネスト一段階ずつ探して行かなければなりません。

module Foo
   class Bar
   end
end

"Foo::Bar".constantize #=> Foo::Bar

Kernel.cont_get("Foo::Bar") # NameError発生
Kernel.const_get("Foo").const_get("Bar") #=> Foo::Bar
編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。