gpt4 book ai didi

ruby - BasicObject 的 singleton_class 的父类(super class)如何以及为什么是 Ruby 中的 Class 类?

转载 作者:行者123 更新时间:2023-12-05 08:35:30 30 4
gpt4 key购买 nike

根据定义,一个对象的单例类也继承了该对象父类(super class)的单例类。 ruby 中的 BasicObject 没有任何父类(super class),因为它是最基本的级别类

>> BasicObject.superclass
=> nil

但是当同一个方法调用它的单例类时,结果是:

>> BasicObject.singleton_class.superclass
=> Class

还有为什么 ruby​​ 中没有其他对象将 Class 类作为其父类(super class)?

BasicObject的singleton_class父类(super class)背后的逻辑在Ruby中是如何实现的?

最佳答案

一般来说,对象的单例类的父类(super class)就是对象的类。 IE。对于具有单例类的任何对象 foo,以下内容成立:

foo.singleton_class.superclass == foo.class

但是,对于类来说,这会有些乏味:每个类的类都是Class,所以每个类的单例类的父类(super class)总是Class

这不是特别有用,因为它会打破一些合理的假设。例如,如果我有这样的东西:

class Super
def self.super_singleton_method; end
end

class Sub < Super; end

我希望能够调用 Sub.super_singleton_method。然而,为了做到这一点,Super.singleton_class 需要位于 Sub.singleton_class 的方法查找链中的某个位置。

所以,对于类,规则有些不同:一个类的单例类的父类(super class)是该类的父类(super class)的单例类。 IE。对于任何类 Foo,以下成立:

Foo.singleton_class.superclass == Foo.superclass.singleton_class

如果需要,您可以检查系统中的每个类是否都是这样:

ObjectSpace.each_object(Class).select do |klass|
klass.singleton_class.superclass != klass.superclass.singleton_class
end
#=> [BasicObject]

因此,如您所见,此属性确实适用于BasicObject 之外的所有类。

为什么 BasicObject 不同的简单答案是 BasicObject 没有父类(super class),因此我们不能应用该规则。因此,我们求助于所有对象的更一般规则

foo.singleton_class.superclass == foo.class

BasicObject的类是Class,因此,

BasicObject.singleton_class.superclass == BasicObject.class
BasicObject.singleton_class.superclass == Class

and also why no other object in ruby have the Class class as its superclass?

Class 继承的唯一原因是要覆盖 Ruby 中继承或方法查找工作方式的行为。但是 Ruby 不允许覆盖它。继承和方法查找的工作方式是语言规范的一部分,无法更改。因此,从 Class 继承是非法的:

class MyClass < Class; end
# can't make subclass of Class (TypeError)

因此,不可能有任何对象将 Class 作为其父类(super class),except 类的单例类。 (Ruby 当然可以打破自己的规则,因为它是制定规则的人。)

How the logic behind the superclass of singleton_class of BasicObject is implemented in Ruby?

事实并非如此。你无法解释这在 Ruby 中是如何工作的,因为它是 Ruby 本身定义的一部分。

类似于 ClassModule 的子类,但是 Module 是一个类,即 Class 的一个实例。你无法使用 Ruby 规则从 Ruby 内部解释这一点,但是 Ruby 实现当然可以设置它以使其起作用,因为 Ruby 实现本身不必遵守 Ruby 规则:它是唯一的执行规则,因此它可以选择不为自己执行规则。

关于ruby - BasicObject 的 singleton_class 的父类(super class)如何以及为什么是 Ruby 中的 Class 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74860029/

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