我在模块的命名空间下有一个类,比如说
Module::Klass
我可以Klass
从控制台访问,它给了我:
Module::Klass
但是,如果我尝试使用:
"klass".constantize # Calling constantize on String
它会出错,因为它没有附加模块命名空间。
所以,我的问题是:有没有办法根据其当前上下文对字符串进行常量化,以便我收到 klass 名称及其模块?
我在模块的命名空间下有一个类,比如说
Module::Klass
我可以Klass
从控制台访问,它给了我:
Module::Klass
但是,如果我尝试使用:
"klass".constantize # Calling constantize on String
它会出错,因为它没有附加模块命名空间。
所以,我的问题是:有没有办法根据其当前上下文对字符串进行常量化,以便我收到 klass 名称及其模块?
如果“当前上下文”是指您当前位于该模块中,则可以直接访问其常量。
module Foo
class Bar
end
self.const_get('Bar') # => Foo::Bar
end
当然,如果您不在Foo
.
Foo.const_get('Bar') # => Foo::Bar
不使用常量化:
该名称被假定为顶级常量之一,无论它是否以“::”开头。不考虑词汇上下文:
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