关于Ruby中OBJECTS的问题

时间:2012-01-11 01:36:14

标签: ruby oop object

我正在阅读'红宝石中的元编程'

这是一本优秀的书。说真的,它谈到了我从未听过其他地方提到过的东西。

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

  1. 我知道RubyGems gem将方法'gem'安装到模块Kernel,以便它显示在每个对象上。他们没有把它放入Object类吗?

  2. 他谈到了红宝石如何寻找它总是正确的方法。 'up'究竟是什么意思?我在图中看到它,它只是我不明白'up'的目的。他没有解释那部分内容。

  3. Object类有什么意义?为什么这些方法不能被放入课堂?如果每个对象都属于一个类(即使它的类),那么对象,基本对象和内核的重点是什么?

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

  5. 我知道内核包含可以在任何地方使用的put之类的方法,这与问题1有关,但为什么它们只是压缩它并将它全部放入Object ...它似乎一切都继承自无论如何对象

2 个答案:

答案 0 :(得分:2)

  1. 两者都可以,但通常Object上的方法应该只是处理特定对象的方法。在Kernel模块中设置内容不是关于对象而是更全局。

  2. 我认为这意味着“继承链”。所以它在子类上查找该方法,然后在该类上查找父类,直到找到一个或用完父类。

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

  4. 红宝石中几乎所有东西都是物体。 Class.superclass实际上是Module(就像您无法实例化的类)而Module.superclass会返回Object。所以Class < Module < ObjectClass类的继承链。 (至少为红宝石1.8)

  5. 比任何事情更多的约定。由于Object可能会变得相当巨大,因此习惯上将事物放入模块中,然后再将这些模块组合起来。如果方法不直接将对象的实例作为self处理,则该方法不直接属于Object。更多全局非对象实例方法(如gem)会放在Kernel模块中,表示它们只是可用的方法。


  6. 关于类对象和继承的更多内容......

    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继承,但它会创建不具有的对象。

    将类视为对象可能会以这种方式弯曲,但这也是红宝石很棒的原因。

答案 1 :(得分:1)

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

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

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

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