了解ruby .class和.ancestors方法

sha*_*evy 29 ruby

我有一个如下定义的类

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对象模型的外观.

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.