【问题标题】:Questions about OBJECTS in Ruby关于 Ruby 中的 OBJECTS 的问题
【发布时间】:2012-02-07 10:38:05
【问题描述】:

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

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

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

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

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

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

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

  5. 我知道内核包含可以在任何地方使用的方法,例如 puts无论如何都反对

【问题讨论】:

  • 我认为在进入元编程之前,您需要先阅读一本探讨面向对象编程基础的书。有很多,快速搜索就会找到它们。
  • 对于 3: 如果他们将这些方法放到 Class 上,它们将可用于 Class 的实例(字符串、数组等),但不能用于 Class 实例的实例( String.new、Array.new 等)对于 4: Class 是 Object Class.ancestors # => [Class, Module, Object, Kernel, BasicObject] 的子类
  • @Iain:“有很多,快速搜索就会找到它们。” - 使用 Ruby 作为编程语言的书籍,还是使用 Java 和 SmallTalk 等其他语言的书籍?
  • 如果您对使用 Ruby 感兴趣,那么 Ruby。否则,任何 OO 语言,因为它们都会以类似的方式处理基础知识。不过,我确实认为 Ruby 是一个特别好的选择,因为我认为它的 OO 做得很好,语法/风格不会妨碍学习。
  • @Iain:如果是这样,请列举一些探索面向对象编程基础并使用 Ruby 作为编程语言的好书。

标签: ruby oop object


【解决方案1】:
  1. 两者都可以,但通常Object 上的方法应该只是处理特定对象的方法。将东西放在Kernel 模块中不是关于对象,而是更全局。

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

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

  4. 几乎所有的 ruby​​ 都是对象。 Class.superclass 实际上是 Module(这就像一个你不能实例化的类)并且 Module.superclass 返回 Object。所以Class < Module < ObjectClass 类的继承链。 (至少对于 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​​ 很棒的原因。

【讨论】:

  • 如果你不能实例化一个方法,那么 x = Module.new 怎么工作?
  • 当您意识到Class.new.new 做了什么时,您就会知道拥有它 :)
  • 哦,我明白了……那一定是一个未命名的模块,如果你有模块 Hello,你不能做 Hello.new。
  • 因为Module.new 制作了一个新模块。 module FooFoo 定义为 Module 类的一个实例。 module Foo; end; Foo.new 导致错误,证明不能实例化模块(这是Module的实例),但可以实例化Module(这是Class的实例) .
【解决方案2】:

对于 1 和 5,伪关键字命令倾向于进入内核而不是对象。

对于 2,子类相对于其父类“向下”是有意义的(子字面意思是“下方”)。因此,如果您要前往父类及其祖先,则必须“向上”。

对于 3,object 对象不是Class 的实例,它是Object 的实例。

对于 4,作为 Class 的实例并从 Object 继承的东西有什么问题?所有类都继承自 Object。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2019-03-22
    • 2011-07-25
    • 2012-12-12
    • 2011-08-17
    相关资源
    最近更新 更多