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

后端 未结 4 1943
既然无缘
既然无缘 2020-11-29 18:55

I have the name of a class and I want to create an instance of that class so that I can loop through each rails attribute that is present in the schema of that class.

<
相关标签:
4条回答
  • 2020-11-29 19:16

    Very simple in Rails: use String#constantize

    class_name = "MyClass"
    instance = class_name.constantize.new
    
    0 讨论(0)
  • 2020-11-29 19:18

    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> 
    
    0 讨论(0)
  • 2020-11-29 19:22
    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.

    0 讨论(0)
  • 2020-11-29 19:29

    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
    
    0 讨论(0)
提交回复
热议问题