Ruby Digest
装各种软件的过程中,看到了很多使用Rake的地方,以及 .yml等跟ruby有关系的东西。觉得了解下ruby多少有点好处,就买了本ruby元编程在家看。看的过程中不断惊叹,还有如此优美的语言!把其中自己觉得重要的东西记录在这里,遂成此文。
对象模型
- 一切皆对象(类也是对象)
打开类
修改已有的类
class String
def to_alphanumeric
gsub /[^\w\s]/, ''
end
为String添加 to_alphanumeric 方法(而不是复写String), 称之为猴子补丁(Monkey Patch)
- Ruby中同名class只有一个,后续定义都是 modify
- class关键字更像是作用域操作符而不是类型声明语句
- 潜在的危险:复写已有的方法!(同名的时候)
- 补救方法: selector 把复写控制在一定代码空间内
类的真相
class MyClass
def my_method
@v = 1
end
obj = MyClass.new
obj.my_method
- @v 称为obj的实例变量,类似于python里的
self.v
- my_method称为obj的方法, MyClass的实例方法, 记为
MyClass#my_method
- obj仅包含它的实例变量及对自身类的引用(及唯一object_id)
- obj.methods 返回所有方法(方法都存在类里,而非对象里)
- 类自身也是对象,其类为Class(Python里称为元类,一般为type)
- Class 的父类为 Module, 父类为 Object, 父类为 BasicObject
常量
任何以大写字母开头的引用(包括类名和模块名)
- 仅充当常量容器的模块,被称为命令空间(类似Python consts.py)
方法查找 Method Lookup
- 接收者(receiver): 方法调用者
- 祖先链(ancestors chain): superclass链(以及module, eigenclass)
- .ancestors 得到祖先链
- include 一个模块时,创建一个匿名类封装;该类称为 include class 或 proxy class
执行方法 Method Execution
- self 隐式传入方法(python显式)
- 当前对象一般是方法调用者
- 特例:在Class Module作用域内,self就是这个Class或 Module
- 包含多个模块时,后包含的在祖先链上方