Yukang's Page

Metaprogramming Ruby

2013-08-24

『Metaprogramming Ruby』这本书看了两遍,从这本书里获取了一些乐趣。技术书籍就应该这样简明扼要,寓理于事。通过一个显示中的例子引入问题,展示元编程的解决办法, 顺带介绍一下用到相关技术的gems。

下面这些不是书评,只是我在看第二遍的时候的一些简单的择要,用于自己的记忆和检索。

Introduction

  • Meteprogramming is writing code that writes code
  • 鬼城和集市,很多语言的运行环境在执行的时候已经固定,一片死寂。而支持Metaprogramming的语言的执行环境是充满活力的集市。很好的比喻。
  • 动态元编程和静态元编程,C++的template属于静态元编程。

The Ruby Object Model

  1. Class定义永远是开放的,你能重新定义任何类或者给类加上一些新的东西。注意MonkeyPatch可能导致的Bug。
  2. 分清楚instance_method和class_method,
  3. instance_method
  4. Class也是对象。与C#/Java的Class不一样的地方,Ruby允许在代码运行期间操作类相关的信息,比如增加method或者重新定义method。
  5. object_model

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.
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章