gpt4 book ai didi

ruby - 有人可以解释 Class.superclass.class.superclass 悖论吗?

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

这可能根本不是悖论,但从新手的角度来看,确实如此。

> Class.superclass
=> Module
> Class.superclass.class
=> Class
> Class.superclass.class.superclass
=> Module

所以一个类的父类是模块,但模块是一个类?

我怎样才能理解这一点?

最佳答案

TL;DR:模块是 类的父类(super class)。模块是 类的一个实例。


让我试着更清楚地解释一下。请原谅我手写的图——我没有什么花哨的绘图软件。

Ruby 中的每个类都有 1 个父类(super class)*。

enter image description here

* BasicObject 除外,它没有父类(super class)。

像这样阅读上图:Float 的父类(super class)是 Numeric。 Numeric的父类(super class)是Object等...

当您实例化一个对象时,该对象将是某个类的实例。例如,“Nathan”是 String 类的一个实例。 “乔”或“约翰”也是如此。 1 是 Fixnum 类的实例,2、3、4 等也是...

enter image description here

像这样阅读上图:“Joe”是 String 的一个实例。 1 是 Fixnum 等的一个实例...

好吧,在 Ruby 中,与大多数其他语言不同,Class 只是另一个类,它也可以被实例化,就像 Fixnum 或 String 一样。

enter image description here

像这样阅读上图:0.01 是 Fl​​oat 的一个实例。 String 是 Class 的实例等...

意识到 Fixnum 是 Class 的实例,就像“Nathan”是 String 的实例一样。就像“John”是 String 的实例一样,Float 只是 Class 的实例。每个类都只是 Class 的一个实例,甚至是 Class 本身!

每当您在应用程序中编写一个新类时,您只是在实例化一个类为 Class 的新对象,就像 Hash.new 实例化一个新的 Hash,或者“Nathan”实例化一个新的 String。

# By running this, you will be instantiating a new Class, and 
# it will be named Post
class Post < ActiveRecord::Base
end

# Here is another perfectly valid way to write the above code:
Post = Class.new(ActiveRecord::Base)

# you can even instantiate a Class without giving it an explicit name:
x = Class.new(ActiveRecord::Base)

# and since your new things are classes, they can be instantiated
obj1 = Post.new
obj2 = x.new

此外,Module 只是 Class 的另一个实例。每当您在应用中编写新模块时,您只是在实例化一个新模块。

# this will instantiate a new Module, and assign it to Foo
module Foo
end

# Here is another perfectly valid way to write the above code:
Foo = Module.new

# you can even instantiate a Module without giving it an explicit name.
m = Module.new

旁白:模块只是方法和常量的集合。类也是方法和常量的集合,但具有能够被实例化的附加功能。无法实例化模块。也就是说,m.new 将不起作用。

所以,回到上面的图,你的问题可以直接回答:

So a class's parent is module, but module is a class?

从上图可以看出:Module是类的父类(super class)。

从底部图形开始:模块是 类的一个实例。

关于ruby - 有人可以解释 Class.superclass.class.superclass 悖论吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10558504/

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