gpt4 book ai didi

ruby - 关于 Ruby 中 OBJECTS 的问题

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

我正在阅读“ruby 中的元编程”

这是一本非常棒的书。说真的,它谈到了我在其他地方从未听说过的东西。

我有几个关于对象的具体问题(我在前几章)

  1. 我知道 RubyGems gem 将方法“gem”安装到模块内核,以便它显示在每个对象上。他们没有将其放入 Object 类中有什么原因吗?

  2. 他谈到当 ruby​​ 寻找方法时,它总是立即向上移动。 “向上”到底是什么意思?我在图中看到了它,只是我不太了解'up'的目的。他没有太多解释那部分。

  3. Object 类的意义何在?为什么这些方法不能直接放在类中?如果每个对象都属于一个类(即使它是类),那么对象、基本对象和内核的意义何在?

  4. String, Array, blah blah 显然是类的一个实例。类也是它自己的一个实例。那么,如果 Class 是 Class 的一个实例……它又是如何继承自 Object 的呢?它在代码中的哪个位置与类和对象相关?

  5. 我知道内核包含可以在任何地方使用的 puts 等方法,这与问题 1 相关,但为什么他们不能将其压缩并将其全部放入 Object... 看起来一切都继承自无论如何反对

最佳答案

  1. 两者都可以,但通常是 Object 上的方法应该只是处理特定对象的方法。把东西放在 Kernel 里模块更少地关注对象,更多地关注全局。

  2. 我认为它的意思是“沿继承链向上”。因此它在子类上寻找方法,然后在该类的父类上寻找方法,直到找到一个或用完父类。

  3. Object是所有对象的基类,自然是 (至少对于 ruby​​ 1.8)。疯狂的部分是类实际上是 Class 的一个实例。类(class)。 (你明白了吗?)因此将实例方法添加到 Class会向类对象添加方法,但不会向这些类的实例添加方法。

  4. 在 ruby​​ 中几乎所有东西都是对象。 Class.superclass实际上是 Module (这就像一个你不能实例化的类)和 Module.superclass返回 Object .所以Class < Module < Object如果 Class 是继承链类(class)。 (至少对于 ruby​​ 1.8)

  5. 更多的是惯例。自 Object可以变得相当大,习惯上将东西放入模块中,然后再组合这些模块。如果该方法不直接处理对象的实例 self那么该方法不直接属于 Object .更多全局非对象实例方法,如 gem进入Kernel模块来表示它们只是随处可用的方法。


更多关于类对象和继承...

class Foo < Bar
def hi
puts 'Hi!'
end
end

它的功能真的很棒。当然,它定义了一个类对象。现在这个类对象被配置为有一个名字 Foo , 一个父类 Bar和一种方法 hi .此信息有点像此类对象的元数据。

现在类对象Foo本身是一个实例 Class .但是Foo 定义一个继承自 Bar 的类. Class类定义了一个数据结构来存储关于类的元数据。

你可以想到Class类有点像这样定义:

class Class < Module

# fictional method called on class creation
def set_meta_data(name, superclass, methods)
@name = name
@superclass = superclass
@methods = methods
end

# fictional way in which an instance might be created
def new
instance = Object.new
instance.superclass = @superclass
instance.addMethods(@methods)
instance
end
end

所以一个类对象本身会继承自Class但它会创建不存在的对象。

以这种方式将类视为对象可能有点费脑筋,但这也是 ruby​​ 很棒的原因。

关于ruby - 关于 Ruby 中 OBJECTS 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8813074/

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