Module M
Class C
end
end
我需要的是:
M.was_defined_here?(M::C)
M.classes.include?(M::C)
这是否以某种方式存在?
我知道我可以解析M :: C.name。但有人可能有想法改变模块#名称,使其更具有讽刺意味。我想要一个干净的解决方案。
答案 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