4

我在模块的命名空间下有一个类,比如说

Module::Klass

我可以Klass从控制台访问,它给了我:

Module::Klass

但是,如果我尝试使用:

"klass".constantize # Calling constantize on String

它会出错,因为它没有附加模块命名空间。

所以,我的问题是:有没有办法根据其当前上下文对字符串进行常量化,以便我收到 klass 名称及​​其模块?

4

2 回答 2

16

如果“当前上下文”是指您当前位于该模块中,则可以直接访问其常量。

module Foo
  class Bar
  end

  self.const_get('Bar') # => Foo::Bar
end

当然,如果您不在Foo.

Foo.const_get('Bar') # => Foo::Bar
于 2013-09-02T18:10:24.590 回答
7

不使用常量化:

该名称被假定为顶级常量之一,无论它是否以“::”开头。不考虑词汇上下文:

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
于 2013-09-02T18:11:52.880 回答