了解ruby .class和.ancestors方法

时间:2013-09-27 07:33:56

标签: ruby

我的课程定义如下

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 个答案:

答案 0 :(得分:60)

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

Ruby object model diagram

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

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正在给你 {{1}的祖先}}