Ruby元编程——小记
之前在微博上看大佬们讨论 ES6、ES7 等新规范,经常谈论一些“元编程”、“λ 表达式”,小白不懂啊,于是去图书馆看了几天《Ruby 元编程》,努力学习一下新姿势,遂有此文。
作为入门,看了一点点 《Programming Ruby》,可以说 Ruby 是一门相当易学、相当灵活的语言,语法糖也很多,适合我这种甜食爱好者,可以扩展思路。
元编程
大佬们是这么说的:元编程是编写能写代码的代码。这个“能写代码的代码”真是抽象极了。具体点说,元编程是:“编写能在运行时操作语言构件的代码”。一个语言的语言构件包括它的变量、类、方法,……等等一切。
什么叫操作语言构件?简单的说,就是“操纵”语言构件的行为。当然,语言构件都有着其默认职责。比如,对象 obj
下有一个属性 prop
,那么我们可以通过 obj.prop
来访问该属性的值,通过 obj.prop=
来改写该属性的值。这就是该语言构件(对象的属性)的默认行为。对其默认行为进行操纵,即为元编程。以下为两个例子:
- 使用 set / get 自定义存值、取值行为
- 使用 obj[“prop”] 写法,用字符串来定位属性名,实现属性的批量生成、读写
语言本身对其语言构件都是有着一定的行为约束的。约束越少,允许我们“自定义”的程度越大,那么这门语言就越灵活、越不可控、越容易进行元编程。
在 JS 中,访问一个未定义变量 a
会报:Uncaught ReferenceError: a is not defined
,访问一个未定义对象属性会返回 undefined
,访问一个未定义方法 f
会报:Uncaught TypeError: f is not a function
。如果你表示不满,想要自定义出错的默认行为,那么除了 try-catch
外没有什么办法了。然而在 Ruby 中这些行为也是可以操纵的:通过修改 method_missing
和 const_missing
就可以自定义出错的默认行为,这使语言更灵活,同时衍生出“幽灵方法”、“动态代理”等一系列高级技巧,这些也是典型的元编程。
当然,JS 使用 try-catch
也不是不能实现同样的功能,只是很麻烦———— Ruby 中提供了语法糖一样的存在,对于元编程更加友好。Ruby 这门语言实在是太灵活了,你几乎可以操纵一切。
ES7 中的 Proxy 用于拦截、修改某些操作的默认行为,是典型的元编程增强。
“根本没有什么元编程,只有编程而已。”
λ 表达式
lambda 表达式,通常指一个匿名函数。比如:function(a,b) {return a+b}
。ES6 中可以这样写了:(a,b) => a+b
。一个听起来高大上然而我们每天都在用的东西。
其实我们写 JS 的更容易理解什么是 λ 表达式呢。
附两张看书时所记的脑图。