我有一个如下定义的类
class Order
end
puts Order.class #-> Class
puts Order.ancestors #-> [Order, Object, Kernel, BasicObject]
puts Order.class.ancestors #->[Class, Module, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么Order.ancestors没有在祖先链中显示"类"或"模块"?由于Order是Class类的对象,不应该Order显示Class的所有祖先?
Aru*_*hit 62
为此,您需要了解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]
Run Code Online (Sandbox Code Playgroud)
因此,如果你查看输出并理解上面的代码,那么现在应该清楚以下内容:
Order.ancestors #-> [Order, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
现在看,
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]
Run Code Online (Sandbox Code Playgroud)
因此,如果你查看输出并理解上面的代码,那么现在应该清楚以下内容:
Order.class.ancestors #->[Class, Module, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
那Order.ancestors就是给你这个班的祖先Order,而Order.class.ancestors给你的是祖先Class.