如何从Ruby中的字符串"A :: B :: C"获取类对象?

And*_*rei 9 ruby class object

以下示例失败

class A
  class B
  end
end
p Object.const_get 'A' # => A
p Object.const_get 'A::B' # => NameError: wrong constant name A::B
Run Code Online (Sandbox Code Playgroud)

UPDATE

前面提到的有关该主题的问题:

  1. 在String和Classname之间转换
  2. Ruby String#to_class
  3. 在Ruby中按名称获取课程?

最后一个提供了一个很好的解决方案,可以演变成

class String
  def to_class
    self.split('::').inject(Object) do |mod, class_name|
      mod.const_get(class_name)
    end
  end
end

class A
  class B
  end
end
p "A::B".to_class # => A::B
Run Code Online (Sandbox Code Playgroud)

Mar*_*off 7

您必须自己手动"解析"冒号并调用const_get父模块/类:

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 
Run Code Online (Sandbox Code Playgroud)

有人撰写了qualified_const_get可能感兴趣的内容.


Jer*_*ten 6

这是Rails的constantize方法:

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
Run Code Online (Sandbox Code Playgroud)

看,它从它的Object顶部开始,然后在双分号之间使用每个名称作为踏脚石来获得你想要的常数.