Ruby 《Ruby 元编程》读书笔记 (一)

lazybios · September 08, 2015 · Last by lazybios replied at June 26, 2016 · 12439 hits

看 Ruby-China 源码的时候,发现自己在 Ruby 语言和惯用法上有很多不足,于是跑去看了一遍社区 wiki 推荐的《Ruby 元编程》,看完以后神清气爽,搞明白了好多自己不清楚的地方。看书的过程中通过笔记的形式把那些琐碎知识点梳理了一下,都放到了自己的"日拱一卒"的公众号上了,一共 16 篇。我会逐篇放到自己的博客上然后贴到这里与大家分享,希望大家帮忙指正错误和不足。

博客访问地址 :《Ruby 元编程》读书笔记 (一)

相关文章:

《Ruby 元编程》读书笔记 (二) 《Ruby 元编程》读书笔记 (三) 《Ruby 元编程》读书笔记 (四) 《Ruby 元编程》读书笔记 (五)

Ruby元编程

感觉这幅图描绘元编程好传神,所以一直把他当做头图!大家有没有这种感觉?

打开类

可以重新打开已经存在的类并对之进行动态修改,即使像 String 或者 Array 这样标准库的类也不例外。这种行为方式称之为打开类 (open class)

猴子补丁

如果你粗心地为某个类添加了新功能,同时覆盖了类原来的功能,进而影响到其他部分的代码,这样的 patch 称之为猴子补丁 (Monkeypatch)

类与模块

Ruby 的 class 关键字更像是一个作用域操作符,而不是类型声明语句。class 关键字的核心任务是把你带到类的上下文中,让你可以在里面定义方法。

每个类都是一个模块,类就是带有三个方法(new,allocate,superclass)的增强模块,通过这三个方法可以组织类的继承结构,并创建对象

Ruby 中的类和模块的概念十分接近,完全可以将二者相互替代,之所以同时保留二者的原因是为了保持代码的清晰性,让代码意图更加明确。使用原则:

希望把自己代码包含 (include) 到别的代码中,应该使用模块 希望某段代码被实例化或被继承,应该使用类

模块机制可以用来实现类似其它语言中的命名空间 (Namespace) 概念

Ruby 中的::符号

Ruby 中常量的路径 (作用域),类似与文件系统中的目录,通过::进行分割和访问,默认直接以::开头 (例::: Y) 表示变量路径的根位置

什么是对象

对象就是一组实例变量外加一个指向其类的引用。对象的方法并不存在于对象本身,而是存在于对象的类中。

什么是类

类就是一个对象 (Class 类的一个实例) 外加一组实例方法和一个对其超类的引用。Class 类是 Module 类的子类,因此一个类也是一个模块。

load 与 require 方法的异同

通过 load 和 require 都可以进行导入别人的代码,不同的是 load 方法用来加载代码,如果不希望污染当前的命名空间,需要通过 load(‘file.rb’,true) 显式的要求创建一个匿名模块来,接管 file.rb 的常量,require 用于导入类库,此外,就加载次数上 load 方法每次调用都会再次运行所加载文件,require 则对每个库文件只加载一次。

prepend、include 与祖先链

祖先链用于描述 Ruby 对象的继承关系,因为类与模块是父子关系,所以祖先链中也可以包含模块,prepend 与 include 分别可以向链中添加模块,不同的是调用 include 方法,模块会被插入祖先链,当前类的正上方,而 prepend 同样是插入到祖先链,但位置其他却在当前类的正下方,另外通过 Class.ancestors 可以查看当前的祖先链

private 规则

不能通过明确指定接受者来调用私有方法。私有方法只能通过隐性的接受者self调用(Object#send是个例外)

self 相关

调用一个方法时,接受者会扮演 self 角色 任何没有明确指定接受者的方法调用,都当做是调用 self 的方法 定义一个模块 (或类) 时,该模块 (或类) 会扮演 self 角色

对象、类与模块之间关系

对象、类、模块关系图 上面 Module.class 指向的也是 Class 类,可以理解为上面方框内容均为 Class,但他们的父子组织关系通过 superclass 建立并存在异同,可以通过 Class.ancestors 查看。

-待续-

=============== 最后贴一下自己的公众账号

可以十日不将军,不可一日不拱卒,日拱一卒 (rigongyizu365)

👍 能看出比 1 多了些新内容...

我觉得编程的内容优先发博客比较好,因为方便读者写代码实验什么的。

#1 楼 @leekelby 是的 作者也一再强调 ruby 的变化快,修订了不少东西

#2 楼 @chenge 嗯 不过一开始就写长文 总半途而废 后来发现先 写短文,后汇总 比较容易坚持下来,所以就选择了公众账号作为载体

是金子总会发光的 是精品先放在哪里,都掩盖不住其耀眼的光芒

赞,谢谢分享

open class 翻译为开放类会不会跟更好

#7 楼 @hitnoah 从词性上讲,还是动宾结构的要好些,开放感觉是个形容词

非常赞 我现在也打算研究这本书,有什么不懂的还得向楼主请教哈~~

请教一个问题: 在.html.erb 文件中使用<%= t('member') %>,其中,t('member') 是什么用法,为什么能直接取到值"会员"

#10 楼 @ruby_faq t 是一个 helper 方法,全称 (translate),国际化用到的 完整是的 I18n.t
细节可以看这里 http://guides.rubyonrails.org/i18n.html

lazybios in 《Ruby 元编程》读书笔记 (二) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (三) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (四) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (五) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (六) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (七) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (八) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (九) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十一) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十二) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十三) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十四) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十五) mention this topic. 26 Jun 10:50
You need to Sign in before reply, if you don't have an account, please Sign up first.