2

我正在尝试以编程方式获取常量(例如类),但只想查看特定命名空间中定义的常量。但是,const_get在搜索常量时会冒泡到更高的命名空间。例如:

module Foo
  class Bar
  end
end

class Quux
end

如果您随后要求Foo返回常量"Bar",它将返回正确的类。

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

但是,如果您要求它"Quux",它会冒泡它的搜索路径并找到顶级 Quux:

Foo.const_get('Quux')
#=> Quux

有没有办法让它const_get在被调用的模块中搜索?

4

1 回答 1

3

Module#const_get说:

在 mod 中检查具有给定名称的常量如果设置了 inherit,则查找还将搜索祖先(如果 mod 是模块,则搜索 Object。)

如果找到定义,则返回常量的值,否则会引发 NameError。

然后,您可以执行以下操作:

module Foo
  class Bar
  end
end

class Quux
end

Foo.const_get('Quux',false) rescue NameError
# >> NameError
Foo.const_get('Bar',false) rescue NameError
# >> Foo::Bar
于 2013-08-20T11:56:08.783 回答