Ruby元编程笔记——1.对象模型

打开类

在Ruby中,定义类的语句和其他语句没有本质区别,你可以在类定义中放置任何语句。

class C
  puts "Hello"
end
=> Hello

Ruby的class关键字更像是一个作用域操作符而不是类型声明语句。你总是可以重新打开已经存在的类并对它进行动态修改。

class D
  def x
    puts 'x'
  end
end

class D
  def y
    puts 'y'
  end
end

obj = D.new
obj.x            # => x
obj.y            # => y

类的真相

对象中有什么

实例变量

instance_variables

方法

methods

类自身也是对象

Ruby元编程笔记——1.对象模型_第1张图片

Ruby元编程笔记——1.对象模型_第2张图片

常量

任何以大写字母开头的引用(包括类名和模块名),都是常量。

方法查找

向右一步,再向上


Ruby元编程笔记——1.对象模型_第3张图片
image.png

当你在一个类中包含一个模块时,Ruby创建了一个封装该模块的匿名类,并把这个匿名类插入到祖先链中,其在链中的位置正好包含在她的类上方。


Ruby元编程笔记——1.对象模型_第4张图片
包含模块的方法查找

执行方法

每一行代码都会在一个对象中被执行——这个对象就是所谓的当前对象。当前对象也可以用self表示。
当开始运行Ruby程序时,Ruby解释器会创建一个名为main的对象作为当前对象,这个对象有时被称为顶级上下文(top level context)。
在类和模块定义中(并且在任何方法定义之外),self的角色由这个类或模块担任:

class MyClass
  self           # => MyClass
end

小结

  • 对象由一组实例变量和一个类的引用组成。
  • 对象的方法存在于对象所属的类中(从类的角度看,它们叫做实例方法)。
  • 类本身是Class类的对象。类的名字只不过是一个常量而已。
  • Class类是Module的子类。一个模块基本上是由一组方法组成的包。类除了具有模块的特性之外,还可以被实例化(通过new()方法)及被组织为层次结构(通过它的superclass()方法)。
  • 常量像文件系统一样,是按照树形结构组织的。其中模块和类的名字扮演目录的角色,其他普通的常量则扮演文件的角色。
  • 每个类都有一个祖先链,这个链从自己所属的类开始,向上直到BasicObject类结束。
  • 每调用一个方法时,Ruby首先向右一步来到接收者所属的类,然后一直向上查找祖先链,直到找到该方法,或者到达链的顶端为止。
  • 每当类包含一个模块时,该模块会被插入到祖先链中,位置在该类的正上方。
  • 当调用一个方法时,接收者会扮演self的角色。
  • 当定义一个模块(或者类)时,该模块扮演self的角色。
  • 实例变量永远都被认定为self的实例变量。
  • 任何没有明确指定接收者的方法调用 ,都当成是调用self的方法。

你可能感兴趣的:(Ruby元编程笔记——1.对象模型)