如果某个给定的类在给定的模块中定义,可以告诉我

时间:2009-09-18 17:42:44

标签: ruby reflection class module

Module M
    Class C
    end
end

我需要的是:

M.was_defined_here?(M::C)
M.classes.include?(M::C)

这是否以某种方式存在?

我知道我可以解析M :: C.name。但有人可能有想法改变模块#名称,使其更具有讽刺意味。我想要一个干净的解决方案。

2 个答案:

答案 0 :(得分:3)

M.constants.map {|c| M.const_get(c)}.include?(M::C)

或者,根据johannes的评论,使用find(如果M中存在类,并且不会碰巧是M中的最后一个常量,则表现更好 - 尽管它应该很少产生可测量的差异):

M.constants.find {|c| M.const_get(c) == M::C }

编辑:由于您实际上只是想要一个布尔结果,因此any?发送的内容多于find

M.constants.any? {|c| M.const_get(c) == M::C }

答案 1 :(得分:2)

如果根本没有定义M::C

sepp2k's answer将无效,因为Ruby将在该块中引发NameError

试试这个:

M.constants.include?('C')

如果您担心以不同的名称引用M::C,请执行以下操作:

module M
  class C
  end
end

MY_M_C = M::C

然后您可以测试MY_M_C是否与M的{​​{1}}相同,如下所示:

C