查找作用于特定命名空间(模块)的常量(类)

时间:2013-08-20 11:49:43

标签: ruby

我尝试以编程方式获取常量(例如,类),但只想查看特定命名空间中定义的常量。但是,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被调用的模块中进行搜索?

1 个答案:

答案 0 :(得分:3)

Module#const_get说:

  

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

     

如果找到定义,则返回常量的值,否则引发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