gpt4 book ai didi

ruby - 了解 ruby​​ .class 和 .ancestors 方法

转载 作者:数据小太阳 更新时间:2023-10-29 06:26:50 26 4
gpt4 key购买 nike

我有一个定义如下的类

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的所有祖先吗?

最佳答案

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

Ruby object model diagram

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

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 的祖先。

关于ruby - 了解 ruby​​ .class 和 .ancestors 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19045195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com