我的课程定义如下
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的所有祖先吗?
答案 0 :(得分:60)
为此,您需要了解Ruby对象模型的外观。
这意味着默认情况下,使用关键字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}的祖先}} 强>