How do I get class-object from string “A::B::C” in Ruby?

后端 未结 3 1273

The following example fails

class A
  class B
  end
end
p Object.const_get \'A\' # => A
p Object.const_get \'A::B\' # => NameError: wrong constant name A::         


        
相关标签:
3条回答
  • 2021-02-08 17:09

    You'll have to manually "parse" the colons yourself and call const_get on the parent module/class:

    ruby-1.9.1-p378 > class A
    ruby-1.9.1-p378 ?>  class B
    ruby-1.9.1-p378 ?>    end
    ruby-1.9.1-p378 ?>  end
     => nil 
    ruby-1.9.1-p378 > A.const_get 'B'
     => A::B 
    

    Someone has written a qualified_const_get that may be of interest.

    0 讨论(0)
  • 2021-02-08 17:29

    Extlib provides a full_const_get method, which does just this.

    http://github.com/datamapper/extlib/blob/master/lib/extlib/object.rb#L67

    You could either include extlib, or copy this implementation and use it yourself (assuming the licensing is compatible with whatever you're using it for)

    0 讨论(0)
  • 2021-02-08 17:31

    Here is Rails' constantize method:

    def constantize(camel_cased_word)
      names = camel_cased_word.split('::')
      names.shift if names.empty? || names.first.empty?
    
      constant = Object
      names.each do |name|
        constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
      end
      constant
    end
    

    See, it starts at the Object on top of it all, then uses each name in between the double semicolons as a stepping stone to get to the constant you want.

    0 讨论(0)
提交回复
热议问题