显示模块的祖先时,例如String
:
String, Comparable, Object, Kernel, BasicObject
其中一些(String,Object,BasicObject)是类,而其他则不是。有没有区分它们的符号?想到的一个可能的候选人是使用<<
而不是<
来包含模块:
String << Comparable < Object << Kernel < BasicObject
或相反,对于类继承:
String < Comparable << Object < Kernel << BasicObject
但我不确定。如果那里没有符号,您如何看待上述内容?这是如何在UML中表达的?
答案 0 :(得分:2)
我知道没有这样的符号。
但是,在大多数情况下,我认为没有必要。一般来说(这里可能有一些警告,但我现在不能想到),一旦模块是祖先链的一部分,它的行为就像祖先链中的一个类。要使用您的String示例,''.is_a? Comparable
返回true
并在String中的方法中调用super
,Comparable定义的方法将调用Comparable的实现。
唯一的区别在于initialize
,因为您无法创建模块的实例。
对于UML,鉴于此,它可以像一个类(我认为)一样只是一个普通的祖先,因为我不相信UML有任何不同的表示模块的方式。
就我个人而言,我认为你提出的符号有点难以解析,而当我关心时,我宁愿把它全部拼写出来:
a = String.ancestors
a.map{ |c| c.class.to_s.downcase }.zip(a).map { |o| o.join(' ') }.join(' < ')
#=> "class String < module Comparable < class Object < module PP::ObjectMixin < module Kernel < class BasicObject"