『Metaprogramming Ruby』这本书看了两遍,从这本书里获取了一些乐趣。技术书籍就应该这样简明扼要,寓理于事。通过一个显示中的例子引入问题,展示元编程的解决办法,顺带介绍一下用到相关技术的 gems。
下面这些不是书评,只是我在看第二遍的时候的一些简单的择要,用于自己的记忆和检索。
Introduction
- Meteprogramming is writing code that writes code
- 鬼城和集市,很多语言的运行环境在执行的时候已经固定,一片死寂。而支持 Metaprogramming 的语言的执行环境是充满活力的集市。很好的比喻。
- 动态元编程和静态元编程,C++ 的 template 属于静态元编程。
The Ruby Object Model
- Class 定义永远是开放的,你能重新定义任何类或者给类加上一些新的东西。注意 MonkeyPatch 可能导致的 Bug。
- 分清楚 instance_method 和 class_method,
- Class 也是对象。与 C#/Java 的 Class 不一样的地方,Ruby 允许在代码运行期间操作类相关的信息,比如增加 method 或者重新定义 method。
Methods
- static type checking, for example, if you call simple_talk() on Layer object that has no such method, the compiler protests loudly.
- call method dynamic using send().
- define_method generates instance method dynamically, to_s vs to_sym.
- Ghost method, method_missing.
过多是用会不会拖慢执行效率,要顺着继承链一直查找 method。
注意 method_missing 可能导致的死循环调用。
和继承过来的 method 之间的冲突,undef_method 解决。
Blocks
- class, module, and def change scope.
- Flat Scope.
- instacen_eval/instance_exec
- create block : lambda/proc/Proc.new
- lambda vs Proc
return in Proc also return from the scope.
lambda’s argument checking is more strict.
- A event DSL, a elegent example for blocks.
Class Definitions
- A Ruby class definition is actually regular code that runs.
- class_eval vs instance_eval
class_eval both changes self and current class
- Eigenclass, the metaclass of a object
- three way to define class method
- Around alias
Code writes code
- The powerful weapon: eval
- A good example: add_attribute
- Three ways to express this idea
Active record
- Validations
- alias_method_chain
- Dynamic attributes, define read/write/question Dynamic Methods for all the columns in databases, for performance.
- Lesson learned, performance/complexity/readable trade-offs.
Metaprogramming safely
- Defusing Monkeypatches, make it explicit with module, check it before patche, add warning messages.