0

当显示模块的祖先时,例如String

String, Comparable, Object, Kernel, BasicObject

其中一些(String、Object、BasicObject)是类,而另一些则不是。有没有区分它们的符号?想到的一个可能的候选者是使用<<而不是<用于模块包含:

String << Comparable < Object << Kernel < BasicObject

或者相反,对于类继承:

String < Comparable << Object < Kernel << BasicObject

但我不确定。如果那里还没有符号,您对上述内容有何看法?这在 UML 中是如何表达的?

4

1 回答 1

2

我所知道的没有这样的符号。

不过,在大多数情况下,我认为没有必要。一般来说(这里可能有一些警告,但我现在想不出任何警告),一旦模块成为祖先链的一部分,它的行为就像祖先链中的一个类。要使用您的 String 示例,请''.is_a? Comparable返回truesuper在 String 中调用 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"
于 2012-10-15T01:43:09.697 回答