《Ruby元编程》之Rails源代码赏析笔记。
写在前面
《Ruby元编程》part 2 说的是rails中的元编程,相比part 1 ,这部分的篇幅少了很多。
主要说了这四块:
- ActiveRecord的组成
- ActiveSupport的concern模块
- alias_method_chain
- 属性方法
来逐一看看。
ActiveRecord的组成
- 是什么?
ActiveRecord是一个库,用来将Ruby对象映射到数据库中,然后你就可以直接对model进行操作,使用类的对象与数据库交互,不需要通过传统的SQL语句,rails会帮你转化成SQL语句。
- 依赖和组成
ActiveRecord依赖ActiveSupport,ActiveModel,并且使用ActiveSupport::Autoload来扩展了类。
ActiveRecord::Base是它最重要的类,由一堆模块组装起来,通过extend,include 多个module,获得了大量的实例方法和类方法。
ActiveSupport的concern模块
concern模块是一个最小依赖管理系统,它的诞生,是为了解决包含并扩展类中链式包含的问题。
书中较详细地说明了concern的实现机制,通过覆写内核方法append_features来决定module是否进入祖先链 ,不过这段的代码真不好理解。
alias_method_chain
它的兴起是为了处理别名机制,你可以把它看成是环绕别名的构建器,而这也是它消亡的原因。颇有“成也萧何,败也萧何”的味道。
既然它已经逐渐退出舞台,那么用什么来解决给原方法增加新功能的问题呢?
在第五章中提到的prepend,成了它的替代品。
属性方法
是什么?
自动创建的访问器。比如你创建了一个类Student,它有name, age字段,可以通过Student.new创建对象,直接对其name, age读写。
s = Student.new s.name = "Tom" s.age = 18 s.save s.name #=> Tom
这里
name =
,name
,age=
,age
等方法,就是属性方法,都是ActiveRecord通过查看students表的字段进行创建的。发展历史
Rails1.0时,通过幽灵方法来实现属性方法,由于幽灵方法并不是真正的方法,调用时要先完整搜过一遍祖先链,所以Rails2.0时,对属性方法的实现进行了改进。大致的思路是:第一次访问属性时,这个属性是个幽灵方法,ActiveRecord::Base#method_missing会在这时把这个幽灵方法转化为真实的方法,同时method_missing还动态地为数据库中的其他字段创建读,写,查询访问器,下一次再访问时,就会有一个真实的方法器可供访问,不再进入method_missing方法。
一点感触
刚开始看元编程的时候,很激动,像是发现了宝似的,现在看完了,平静了很多。借用书中的一句话:元编程的目的不是为了让代码变得更聪明,而是让代码变得更灵活。
Happy metaprogramming!