以下示例失败
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
前面提到的有关该主题的问题:
最后一个提供了一个很好的解决方案,可以演变成
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)
您必须自己手动"解析"冒号并调用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可能感兴趣的内容.
这是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顶部开始,然后在双分号之间使用每个名称作为踏脚石来获得你想要的常数.
| 归档时间: |
|
| 查看次数: |
4003 次 |
| 最近记录: |