Metaprogramming of Ruby 读书笔记第一章
一、Ruby中关于类和对象的概念
1、对象:对象是一组实例变量外加一个指向其类的引用。对象的方法并不存在于对象本身,而是存在于对象的类中。所以这些方法被我们称作类的实例方法。
图:对象与类的关系,以及实例方法的归属
2、类:类其实是Class类的一个对象,外加一组实例方法和一个对其超类的引用。Class类是Module类增加了new()方法的子类,所以一个类必然是一个模块。
3、每个类都有属于自己的方法,比如new(),这些是Class类的实例方法。跟其他的对象一样,类也必须通过引用进行访问。我们通常使用一个常量来引用它们:也就是类名。
4、所有类都是Object类的子类,Object类是BasicObject的子类,BasicObject才是ruby对象体系中的根节点。
![](https://img-my.csdn.net/uploads/201211/18/1353225684_5624.jpg)
图:对象,类,Class类,Module类和Object类的关系
图:Class的类,Object的类,Module的超类
5、关于include:当使用include引入一个模块时,Ruby创建一个封装该模块的匿名类,并悄悄滴把它插入到当前类的祖先链中。其位置就在当前类的正上方。这时,.superclass方法并不能找到这个类,只有.ancestors才会发现它的存在。这里最常见的例子就是Object类是包含了Kernel模块的(包含了诸如printf等方法)
如果有多个include的话,每次都在这个类的正上方插入,其余的类顺次提高一位:
class Book
include Printable
include Document
ancestors # => [Book, Document, Printable, Object, Kernel, BasicObject]
end
二、Ruby中的self和与众不同的private
self本身的概念并没有特别之处:最后一个调用某方法的对象就是该方法的当前对象(receiver)。显然,self本身就是一个正常的对象,只不过它的具体内容是不断变化的。
问题在于Ruby中私有(private)的规则:
私有规则:私有方法只能被“隐含的” 接受者调用。
class C
def public_method
self.private_method
end
private
def private_method; end
end
C.new.public_method
NoMethodError: private method ‘private_method' called [...]
上面的这次实验本不应该有问题的——除了它使用self来调用了自己定义的私有方法。去掉self之后,代码正常。 原因:我们不能显式地指定某个对象(包括使用self来指定)来调用私有方法。
有了这条铁律,我们可以明确的得到一些事实:同一个类的不同实例能不能直接互相调用对方的私有方法?不能!无论如何你都得写成x.method或者y.method,这是不行的。
我能不能调用父类中的私有方法?可以的,这个调用完全可以隐式地实现,不是么。
(上面的事实可能令我们Java开发者有点掉下巴)
三、类和模块的区别
书中介绍的其实足够详细了:类不过是个增强的Module,增加了new allocate superclass方法而已。有了这几个方法你就可以创建对象并可以把它们归纳到类体系架构中(比如集成关系)。不过这里似乎有更专业的解释:Ruby的类与模块
第一章,结束。