一个对象的实力变量存在于对象本身之中,而一个对象的方法存在于对象自身的类中。这就是统一各类的对象共享同样的方法,但不共享实例变量的原因。
Class 类的父类(超类)是Module(模块),每个类都是一个模块。
类就是带有三个方法(new、allovate、superclass)的增强模块。
类可以通过引用来访问。
只是用来充当常量容器的模块被称为命名空间。
什么是对象?对象就是一组实例变量外加一个指向其类的引用。对象的方法并不存在与对象本身,而是存在于对象的类中。在类中这些方法被称为类的实例。
什么是类?类就是一个对象(class 类的一个实例)外加一组实例方法和一个对其超类的引用。Class类是Module类对的子类,因此一个类也是一个模块。
加载(load)副作用:常量(尤其是类名)就有可能污染当前程序的命名空间(变量在加载完成后就会落在当前作用域之外,但常量不会)。
load用于加载代码,require用来导入类库。
接收者(receiver)就是你调用方法所在的对象。
祖先链(ancestors chain):一个类找到它的超类,然后再找到超类的超类,以此类推,知道找到BasicObject类。在这个过程中,经历的类路径就是该类的祖先链。
把模块插入一个累的额祖先链中:使用prepend方法。这个方法会把模块插入祖先链中包含它的该类的下方,而不像include方法插在上方。
###私有规则:
- 如果调用方法的接收者不是自己,就必须明确指明接收者
- 私有方法只能通过隐性的接收者调用
###细化有效场合:
- refine代码块内部
- 从using语句的位置开始到模块结束(如果是在模块内部调用using语句),或者到文件结束(如果是在顶层上下文中调用using)
###总结:
- 对象由一组实例变量和类的引用组成。
- 对象的方法存在于对象所属的类中(对类来说是实例方法).
- 类本身是Class类的对象。类的名字只是一个常量。
- Class类是Module的子类。一个模块基本上就是由一组方法组成的包。类除了具有模块的特征之外,开可以被实例化(使用new方法),或者按一定的层次结构来组织(使用superclass方法)。
- 常量像文件系统一样,是按照树形结构组织的。其中,模块和类的名字扮演目录的角色,其他普通的常量扮演文件的角色。
- 每个类都有一个祖先链,这个链从每个类自己开始,向上直到BasicObject类结束
- 调用方法时,Ruby首先向右找到接收者所属的类,然后向上查找祖先链,直到找到该方法或到达链的顶端为止。
- 在类中包含一个模块(使用include方法)时,这个模块会被插入祖先链中,位置就在类的正上方;而使用prepend方法包含一个模块时,这个模块也会被插入祖先链中,位置在类的正下方
- 调用一个方法时,接收者会扮演self的角色
- 定义一个模块(或类)时,该模块会扮演self的角色
- 实例变量永远被认定为self的实力变量
- 任何没有明确指定接收者的方法调用,都当做是调用self的方法。
细化就像在原来的类上添加了一块补丁,而且他会覆盖正常的方法查找。此外,细化只在程序的部分区域生效;从using语句的位置开始,知道模块结束,或者知道文件结束。
﹣﹣寫於2015年10月27日晚上9點10分整