我在模块的命名空间下有一个类,比如说
Module::Klass
我可以从控制台访问Klass
,它给了我:
Module::Klass
但是,如果我尝试使用:
"klass".constantize # Calling constantize on String
它出错,因为它没有附加模块名称空间。
所以,我的问题是:有没有办法根据当前上下文来对字符串进行限制,以便我收到klass名称及其模块?
答案 0 :(得分:12)
如果通过“当前上下文”表示您当前在该模块中,则可以直接访问其常量。
module Foo
class Bar
end
self.const_get('Bar') # => Foo::Bar
end
如果你不在Foo
之内,你当然可以这样做。
Foo.const_get('Bar') # => Foo::Bar
答案 1 :(得分:8)
不是constantize:
无论如何,该名称被假定为顶级常量之一 是否以“::”开头。没有词汇背景 帐户:
C = 'outside' module M C = 'inside' C # => 'inside' "C".constantize # => 'outside', same as ::C end
但你可以使用const_get():
module MyModule
class MyClass
def self.greet
puts 'hi'
end
end
const_get("MyClass").greet
end
--output:--
hi