回答:
レールでは次のことができます:
clazz = 'ExampleClass'.constantize
純粋なルビーでは:
clazz = Object.const_get('ExampleClass')
モジュール付き:
module Foo
class Bar
end
end
あなたは使うでしょう
> clazz = 'Foo::Bar'.split('::').inject(Object) {|o,c| o.const_get c}
=> Foo::Bar
> clazz.new
=> #<Foo::Bar:0x0000010110a4f8>
Object.const_get('Foo::Bar')
しながら、動作しませんconstantize
でしょう。
clazz = 'Foo::Bar::Uber'
Railsでは非常にシンプルです。 String#constantize
class_name = "MyClass"
instance = class_name.constantize.new
module One
module Two
class Three
def say_hi
puts "say hi"
end
end
end
end
one = Object.const_get "One"
puts one.class # => Module
three = One::Two.const_get "Three"
puts three.class # => Class
three.new.say_hi # => "say hi"
ruby 2.0では、おそらく以前のリリースでObject.const_get
は、などの名前空間に対して再帰的にルックアップを実行しますFoo::Bar
。上記の例は、名前空間が事前にわかっている場合であり、const_get
排他的にではなく、モジュールで直接呼び出すことができるという事実を強調していますObject
。
eval