35

我有一个定义如下的类

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 在祖先链中没有显示“类”或“模块”?既然Order是Class类的对象,Order不应该显示Class的所有祖先吗?

4

1 回答 1

71

为此,您需要查看 Ruby 对象模型的外观。

Ruby 对象模型图

这意味着使用关键字创建的类class将始终是Object默认情况下的子类。Class不是你的类的超类Order,而是类的一个实例ClassModule#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

于 2013-09-27T07:41:02.170 回答