Ruby元编程笔记——1.对象模型
2017-12-15 本文已影响10人
CharlesZhangCh
打开类
在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创建了一个封装该模块的匿名类,并把这个匿名类插入到祖先链中,其在链中的位置正好包含在她的类上方。

执行方法
每一行代码都会在一个对象中被执行——这个对象就是所谓的当前对象。当前对象也可以用self表示。
当开始运行Ruby程序时,Ruby解释器会创建一个名为main的对象作为当前对象,这个对象有时被称为顶级上下文(top level context)。
在类和模块定义中(并且在任何方法定义之外),self的角色由这个类或模块担任:
class MyClass
self # => MyClass
end
小结
- 对象由一组实例变量和一个类的引用组成。
- 对象的方法存在于对象所属的类中(从类的角度看,它们叫做实例方法)。
- 类本身是Class类的对象。类的名字只不过是一个常量而已。
- Class类是Module的子类。一个模块基本上是由一组方法组成的包。类除了具有模块的特性之外,还可以被实例化(通过new()方法)及被组织为层次结构(通过它的superclass()方法)。
- 常量像文件系统一样,是按照树形结构组织的。其中模块和类的名字扮演目录的角色,其他普通的常量则扮演文件的角色。
- 每个类都有一个祖先链,这个链从自己所属的类开始,向上直到BasicObject类结束。
- 每调用一个方法时,Ruby首先向右一步来到接收者所属的类,然后一直向上查找祖先链,直到找到该方法,或者到达链的顶端为止。
- 每当类包含一个模块时,该模块会被插入到祖先链中,位置在该类的正上方。
- 当调用一个方法时,接收者会扮演self的角色。
- 当定义一个模块(或者类)时,该模块扮演self的角色。
- 实例变量永远都被认定为self的实例变量。
- 任何没有明确指定接收者的方法调用 ,都当成是调用self的方法。