下面代码中的“puts A::B::C.is_a?Module”返回true,如果C是模块中的类,则应返回false。
module A
module B
class C
puts A::B.is_a?Class
puts A::B.is_a?Module
puts A::B::C.is_a?Class
puts A::B::C.is_a?Module
end
end
end
false
true
true
true
我想写一个递归函数,它检查类或模块示例以执行操作。请查看下面的代码片段。
def recursive(rootModule)
sampleList = []
rootModule.constants.map do |c|
nextLayer = rootModule.const_get(c)
if nextLayer.is_a? Module
return recursive(nextLayer)
elsif nextLayer.is_a? Class
return sampleList << "alpha"
end
end
end
2条答案
按热度按时间vsikbqxv1#
is_a?
检查对象是否是类或其任何子类的示例。Class
是Module
的子类,所以is_a? Module
对于classes * 和 * modules总是返回true。由于
Module
是更通用的类型,所以不要问“这是一个模块吗?”,你应该问“这个模块不是一个类吗?“.polkgigr2#
如上所述,
Object#is_a?
检查对象是否是类或其任何子类的示例,而Class
是Module
的子类。因此,您可以使用Object#instance_of?
方法,如果obj是给定类的示例,则返回true。实际上,下面的代码也可以工作