理解Ruby中的.class和.ancestors方法

38
我有一个定义如下的类。

class Order
end

puts Order.class #-> Class
puts Order.ancestors #-> [Order, Object, Kernel, BasicObject]

puts Order.class.ancestors #->[Class, Module, Object, Kernel, BasicObject]

我的问题是为什么Order.ancestors不显示'Class'或'Module'在继承链中?由于Order是Class类的一个对象,难道Order不应该展示Class的所有祖先吗?

1个回答

78

为此,您需要了解Ruby对象模型的外观。

Ruby对象模型图

这意味着使用关键字class创建的类默认情况下将始终是Object的子类。 Class不是您的类Order的超类,而是Class类的实例。 Module#ancestors将包括在mod中包含的模块列表(包括mod本身)以及您的类Order的超类。

class Order;end
Order.superclass # => Object
Order.superclass.superclass # => BasicObject
Order.superclass.included_modules # => [Kernel]

所以,如果您查看输出并理解了上面的代码,则下面的内容现在应该对您很清楚:

Order.ancestors #-> [Order, Object, Kernel, BasicObject]

现在看,

class Order;end
Order.class # => Class
Order.instance_of? Class # => true
Order.class.superclass # => Module
Order.class.superclass.superclass # => Object
Order.class.superclass.superclass.included_modules # => [Kernel]

所以,如果您查看输出并理解上面的代码,则下面的内容现在应该对您很清楚:

Order.class.ancestors #->[Class, Module, Object, Kernel, BasicObject]

话虽如此,Order.ancestors 提供给您的是类 Order 的祖先,而 Order.class.ancestors 则提供给您的是 Class 的祖先。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接