关于Ruby中对象的问题

关于Ruby中对象的问题,ruby,oop,object,Ruby,Oop,Object,我在读“ruby中的元编程” 这是一本好书。说真的,它谈论的是我从未在别处听到过的东西 然而,我有一些关于对象的具体问题(我在前几章) 我知道RubyGems gem将方法“gem”安装到模块内核,以便它显示在每个对象上。他们没有把它放到对象类中有什么原因吗 他谈到ruby在寻找这个方法时,总是会立即启动。“up”到底是什么意思?我在图表中看到了,只是我不太明白“向上”的目的。他对那部分解释得不多 对象类的意义是什么?为什么这些方法不能直接放入类中?如果每个对象都属于一个类(即使是它的类),那么

我在读“ruby中的元编程”

这是一本好书。说真的,它谈论的是我从未在别处听到过的东西

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

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

  • 他谈到ruby在寻找这个方法时,总是会立即启动。“up”到底是什么意思?我在图表中看到了,只是我不太明白“向上”的目的。他对那部分解释得不多

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

  • 字符串、数组等等显然是类的一个实例。类也是其自身的一个实例。所以,如果类是类的实例。。。。它是如何从对象继承的?在代码中,它在哪里同时与类和对象相关

  • 我知道内核包含的方法,比如puts,可以在任何地方使用,这与问题1有关,但为什么他们不能将其浓缩并将其全部放入对象中。。。不管怎样,一切都会从对象继承

  • 这两种方法都可以工作,但是
    对象上的方法通常只应该是处理特定对象的方法。在
    内核
    模块中放入的内容与对象无关,而更具全局性

  • 我想它的意思是“继承链的上游”。因此,它在子类上查找方法,然后在该类的父类上查找方法,直到找到一个或耗尽父类

  • Object
    自然是所有对象的基类(至少对于ruby 1.8)。疯狂之处在于类实际上是
    类的实例。(你明白了吗?)所以将实例方法添加到
    Class
    会将方法添加到类对象,但不会添加这些类的实例

  • ruby中几乎所有的东西都是对象
    Class.superclass
    实际上是
    Module
    (类似于无法实例化的类),并且
    Module.superclass
    返回
    对象
    。因此
    Class
    是继承链,如果
    Class
    Class。(至少适用于ruby 1.8)

  • 传统胜过一切。由于
    对象
    可能会变得相当庞大,因此通常会将对象放入模块中,然后再将这些模块组合起来。如果该方法不直接作为
    self
    处理对象的实例,则该方法不直接属于
    object
    。更多的全局非对象实例方法,如
    gem
    进入
    Kernel
    模块,表明它们只是无处不在的方法


  • 关于类对象和继承的更多信息

    class Foo < Bar
      def hi
        puts 'Hi!'
      end
    end
    
    因此类对象本身将继承自
    class
    ,但它将创建不继承的对象


    以这种方式将类看作对象可能有点令人费解,但这也是ruby令人敬畏的原因。

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

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

    对于3,一个
    对象
    对象不是
    的实例,它是
    对象
    的实例


    对于4,作为类的实例并从对象继承有什么不对?所有类都继承自对象。

    我认为在开始元编程之前,您需要尝试一本探讨面向对象编程基本原理的书。有很多,快速搜索就会找到它们。对于3:如果他们将这些方法放到类中,它们将对类的实例(字符串、数组等)可用,但对类的实例(字符串、新、数组等)不可用。对于4:类是对象的子类
    Class.祖先#=>[类、模块、对象、内核、基本对象]
    @Iain:“有很多,快速搜索就会找到它们。”-使用Ruby作为编程语言的书籍,或者使用其他语言(如Java和SmallTalk)的书籍?如果你对使用Ruby感兴趣,那么使用Ruby。否则,任何OO语言都将以类似的方式处理基本原理。不过,我确实认为Ruby是一个特别好的选择,因为我认为它的OO做得很好,语法/风格不会妨碍学习。@Iain:如果是这样,请列举一些探索面向对象编程基础知识并使用Ruby作为编程语言的好书。如果你不能实例化一个方法,那么,x=Module.new是怎么工作的呢?当你意识到Class.new.new的作用时,你就会知道它的作用了:)哦,我明白了。。。这必须是一个未命名的模块,如果有模块Hello,则不能执行Hello.new。因为
    module.new
    生成一个新模块<代码>模块Foo
    Foo
    定义为模块类的实例<代码>模块Foo;结束;Foo.new
    会导致一个错误,证明您无法实例化模块(它是
    模块
    的实例),但您可以实例化
    模块
    (它是
    的实例)。
    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