以下内容纯粹为本人以前学习 Ruby 时的笔记整理。限于个人理解能力,可以肯定一定有 大量的错误,与其说分享,不如说是写出来让大家检查。如果有什么不对,或不准确的 地方,也希望前辈们一定多多指正,不吝赐教。
我希望这里是一个具有良好氛围的中文社区 (我梦寐以求的那个 Ruby 中文社区) 所以我不 希望出现针对这个帖子的不和谐言语或对针对本人的任何不良言语.
总共分为五大部分:每一部分都有上百条,可能会有重复,有些就是直接抄书。都是我 个人的理解以及对某些文章片段的延伸,大家就将就着看了。
markdown 格式折腾了一下午,托万能 Emacs 的福,使用 markdown-mode 搞定了。现在才觉 出 edit-server 的好来,这是另一个 Emacs 插件,可以让我在 Emacs 下使用特定的模式直 接编辑 Chrome 浏览器打开的表单,不过也许用惯了 org-mode 的缘故,这个 markdown 依旧 觉得很不习惯。
顺便提个建议:我总觉得应该开个 lisp 版块。我想凡是接触过 lisp(或 elisp) 的人,应该 都会觉得这两门语言惊人的相似,混入,布尔真假等等,如果说 Ruby 字符串 (尤其是 1.9) 及其强大,完全继承自 Perl 的话,我倒是觉得骨子里的东西 (类,模块) 甚至面向对 象的方式 (Ruby 一切都是对象,lisp 一切都是列表) 都和 lisp 惊人的相似,即使表面上 看起来这是完全不同的两种语言,甚至是不同类型语言。
Ruby 新人可以看看我的基础理论部分,这也是当初我学习 Ruby 心路历程,虽然有些问题很初级,但是我就是这样一步一步走过来的。
类相关部分全是都是关于 Ruby 的基石类的概念。这部分的概念极多.超级复杂,也很抽象,如果你真正理解了 Ruby 的对象模型,会有及其惊艳的感觉。这部分的东西,这部分的大部分内容都是双眼瞪着天花板冥思苦想,也偶尔查阅源码而写出的。深有感触,有什么不对的地方,欢迎高手指正。
小提示部分也很杂乱,这是感觉自己脱离了基础部分之后,写的一些小技巧。
常犯错误部分不用说了,直到现在自己仍旧屡犯不止的错误。
ruby 惯例是自己整理的一些`非必须'的小技巧,但是作为 Ruby 惯例,应该支持。
`类对象'是Class类的实例,它和类的`实例对象'是两码事儿.
`类对象'是一类比较特殊的对象,因为他们不但是对象,也是类,而且他们还有自己的超类.
定义一个类, 其实就是定义一个常量, 并通过这个常量引用一个新创建的`匿名'类对象. 常量名就代表这个类(对象).
Class类是用来创建`类对象'的类.
使用class关键字创建的`类对象'都是常量.
一个类C,自身同时也是一个Class类的实例对象,并且该对象是个常量.
例如:
C = Class.new # => 新建一个类 C.
c = C.new # => 新建类 C 的实例对象 c
class关键字,翻书查不到, 应该是一个及其底层的方法, (使用C来实现), 获取一个对象所属类型的class方法,是在object类定义的一个public实例方法.
一个类名称是一个常量, 这个常量有一个与其对应的的唯一的类对象.
在`类定义体内'而在`实例方法定义体外'定义的实例变量叫做`类实例变量'.跟类变量相似,类实例变量与`类本身'相关联而非与`类的某个特定实例'想关联.
`类实例变量'其实就是Class类的实例变量, 如同普通实例变量, 他们也不会被继承.
类方法, 完整的说:就是`类对象'(可用)的方法.包括`类对象的单例方法'以及`类对象所在类(Class类)的公开实例方法'.如果同名, 前者优先.
一个对象的单例方法,就是那个对象对应的`自我类(eigenclass)'的`实例方法'.
任何对象都有`自我类',为一个对象增加一个单例方法, 就是`打开'自我类,并为其添加实例方法
打开一个`类对象'的`自我类(eigenclass)',并为其定义'实例方法',这就是为类对象定义了一个`类方法'
给一个类增加一个类方法, 其实是给这个`类对象'定义了一个单例方法.
普通对象的`自我类`(eigen)是独立的,没有超类.类对象的自我类比较特殊,它们还有自己的超类.
`类对象的单例方法', 其实就是这个类(自身特有的)类方法.
定义一个类方法,需要显式的在类方法前指定类名称. 例如: def self.方法名; end
基类定义的受保护方法,可以在子类的实例方法内部通过self显式的引用. 但是无法通过外部实例被调用.
实例变量只能在self的上下文被解析,当initialize方法调用时,self会指向该类的一个实例.