0

我正在尝试使用Module的模块比较功能。考虑代码:

module Mod
  module Mod2
  end
end

module ModExtend
  extend Mod
end

puts (Mod<Mod::Mod2).nil?    # Prints "true"
puts (Mod<ModExtend).nil?    # Prints "true"

我希望Mod<Mod::Mod2返回false而不是nil.

4

1 回答 1

1

来自Module#<

如果 mod 是 other 的子类,则返回 true。如果两者之间没有关系,则返回 nil。(考虑类定义的关系:“类 A<B”意味着“A<B”)。

现在我们观察模块祖先

Mod.ancestors       # [Mod]
Mod::Mod2.ancestors # [Mod::Mod2]
ModExtend.ancestors # [ModExtend]

如您所见,它们之间没有祖先关系。

然而,一个模块定义为:

module Mod3
  include Mod
end 

给出:

Mod3 < Mod     # true
Mod3.ancestors # [Mod3, Mod]

根据文档false,永远不会返回Module#<. 然而,nil是一个假值(它的行为类似于false布尔表达式:) !nil #-> true

于 2013-07-30T06:19:24.080 回答