gpt4 book ai didi

Ruby 本征类意外行为

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:45 24 4
gpt4 key购买 nike

首先,让我们添加一个方法来检索特征类“从 this blog post 复制”

class Object 
def eigenclass
class << self
self
end
end
end

然后创建一个简单的类

class A
end

puts A.new.eigenclass.superclass # => A
puts Class.new.eigenclass.superclass # => #<Class:Object>

我期待第二个 put 输出 Class

知道为什么会这样吗?

最佳答案

通过puts A.new.eigenclass.superclass,您实际上是在类 A 的实例 上调用#eigenclass。我将开始用背景故事来解释特征类实际上是如何工作的,然后将继续讲述你的代码中发生了什么。

背景故事:

EigenClass 是一个隐藏类,它包含仅可用于该特定 对象的单例方法。

所以对于 obj = Foo.new,类层次实际上是这样的:

obj --eigenclass--> #> --(superclass)--> A

代替:

obj --(class)--> A

#eigenclass 劫持self 后可以生成一个隐藏类。

现在,在 Ruby 中,Class 是一个对象。这也意味着 #eigenclass 也应该显示 A 的隐藏特征类(其中保留了 A 的单例方法)。

A --(eigenclass)--> # --(superclass)--> #

现在它显示 # 而不是 A 的原因是因为 Ruby 以非常漂亮的模式组织类、父类(super class)和特征类。这可以用例子来表示,而不是用令人困惑的词来引用它:

A.superclass #=> Object   
A.eigenclass #=> #<Class: A>
A.eigenclass.superclass #=> #<Class: Object> => Eigenclass of Object
A.eigenclass.superclass == Object.eigenclass #=> true

一个特征类的父类(super class)是原始的父类(super class)的特征类。

现在,来到你的案例:Class.new.eigenclass.superclass,这是不言自明的。 Class.new 对应于一个新的匿名类,例如 B,您实际上是在调用它的 eigenclass.superclass。因为B的父类(super class)是Object,所以B的特征类的父类(super class)就是B的父类(super class)的特征类。

已尽力举例说明。请随时在下面的评论中进一步澄清;将相应地更新答案。补充(来自 Pragmatic MR):Shot from Pragmatic MR .

在上图中,D继承自C。所以 D.eigenclass.superclass 是(D 的父类(super class))[这是 C] 的 eigneclass。现在 C 的父类(super class)是 Object.. 也是同样的逻辑。

问候

关于Ruby 本征类意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24025901/

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