如何使用Ruby Module比较

时间:2013-07-30 06:14:27

标签: ruby

我正在尝试使用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

1 个答案:

答案 0 :(得分:1)

来自Module#<

的ruby文档
  

如果mod是other的子类,则返回true。如果没有,则返回nil   两者之间的关系。 (想想这种关系   类定义:“A类&lt; B”表示“A&lt; 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)。