分享 zw963 的 Ruby 笔记之`类相关`

zw963 · 2012年02月25日 · 最后由 zw963 回复于 2012年02月26日 · 2564 次阅读

引子


以下内容纯粹为本人以前学习 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 惯例,应该支持。

正文开始


  1. `类对象'是Class类的实例,它和类的`实例对象'是两码事儿.

  2. `类对象'是一类比较特殊的对象,因为他们不但是对象,也是类,而且他们还有自己的超类.

  3. 定义一个类, 其实就是定义一个常量, 并通过这个常量引用一个新创建的`匿名'类对象. 常量名就代表这个类(对象).

  4. Class类是用来创建`类对象'的类.

  5. 使用class关键字创建的`类对象'都是常量.

  6. 一个类C,自身同时也是一个Class类的实例对象,并且该对象是个常量. 例如: C = Class.new # => 新建一个类 C. c = C.new # => 新建类 C 的实例对象 c

  7. class关键字,翻书查不到, 应该是一个及其底层的方法, (使用C来实现), 获取一个对象所属类型的class方法,是在object类定义的一个public实例方法.

  8. 一个类名称是一个常量, 这个常量有一个与其对应的的唯一的类对象.

  9. 在`类定义体内'而在`实例方法定义体外'定义的实例变量叫做`类实例变量'.跟类变量相似,类实例变量与`类本身'相关联而非与`类的某个特定实例'想关联.

  10. `类实例变量'其实就是Class类的实例变量, 如同普通实例变量, 他们也不会被继承.

  11. 类方法, 完整的说:就是`类对象'(可用)的方法.包括`类对象的单例方法'以及`类对象所在类(Class类)的公开实例方法'.如果同名, 前者优先.

  12. 一个对象的单例方法,就是那个对象对应的`自我类(eigenclass)'的`实例方法'.

  13. 任何对象都有`自我类',为一个对象增加一个单例方法, 就是`打开'自我类,并为其添加实例方法

  14. 打开一个`类对象'的`自我类(eigenclass)',并为其定义'实例方法',这就是为类对象定义了一个`类方法'

  15. 给一个类增加一个类方法, 其实是给这个`类对象'定义了一个单例方法.

  16. 普通对象的`自我类`(eigen)是独立的,没有超类.类对象的自我类比较特殊,它们还有自己的超类.

  17. `类对象的单例方法', 其实就是这个类(自身特有的)类方法.

  18. 定义一个类方法,需要显式的在类方法前指定类名称. 例如: def self.方法名; end

  19. 基类定义的受保护方法,可以在子类的实例方法内部通过self显式的引用. 但是无法通过外部实例被调用.

  20. 实例变量只能在self的上下文被解析,当initialize方法调用时,self会指向该类的一个实例.

这部分感觉有点乱,其实 ruby 的对象和类型系统很整齐

@fsword ,可能吧,不过自认为还是很有料的。我争取两到三天更新一次。

zw963 zw963 的 Ruby 笔记之`基础理论` 提及了此话题。 11月13日 16:30
zw963 zw963 的 Ruby 笔记之`小提示` 提及了此话题。 04月03日 10:56
zw963 zw963 的 Ruby 笔记之`常犯错误` 提及了此话题。 04月03日 10:56
zw963 zw963 的 Ruby 笔记之`Ruby 惯例` 提及了此话题。 04月03日 10:56
需要 登录 后方可回复, 如果你还没有账号请 注册新账号