Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I create a class instance from a string name in ruby?

In rails you can just do:

clazz = 'ExampleClass'.constantize

In pure ruby:

clazz = Object.const_get('ExampleClass')

with modules:

module Foo
  class Bar
  end
end

you would use

> clazz = 'Foo::Bar'.split('::').inject(Object) {|o,c| o.const_get c}
  => Foo::Bar 
> clazz.new
  => #<Foo::Bar:0x0000010110a4f8> 

Very simple in Rails: use String#constantize

class_name = "MyClass"
instance = class_name.constantize.new

Try this:

Kernel.const_get("MyClass").new

Then to loop through an object's instance variables:

obj.instance_variables.each do |v|
  # do something
end

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"

In ruby 2.0 and, possibly earlier releases, Object.const_get will recursively perform a lookup on a namespaces like Foo::Bar. The example above is when the namespace is known ahead of time and highlights the fact that const_get can be called on modules directly as opposed to exclusively on Object.