之前在微博上看大佬们讨论 ES6、ES7 等新规范,经常谈论一些“元编程”、“λ 表达式”,小白不懂啊,于是去图书馆看了几天《Ruby 元编程》,努力学习一下新姿势,遂有此文。

作为入门,看了一点点 《Programming Ruby》,可以说 Ruby 是一门相当易学、相当灵活的语言,语法糖也很多,适合我这种甜食爱好者,可以扩展思路。

元编程

大佬们是这么说的:元编程是编写能写代码的代码。这个“能写代码的代码”真是抽象极了。具体点说,元编程是:“编写能在运行时操作语言构件的代码”。一个语言的语言构件包括它的变量、类、方法,……等等一切。

什么叫操作语言构件?简单的说,就是“操纵”语言构件的行为。当然,语言构件都有着其默认职责。比如,对象 obj 下有一个属性 prop ,那么我们可以通过 obj.prop 来访问该属性的值,通过 obj.prop= 来改写该属性的值。这就是该语言构件(对象的属性)的默认行为。对其默认行为进行操纵,即为元编程。以下为两个例子:

  1. 使用 set / get 自定义存值、取值行为
  2. 使用 obj[“prop”] 写法,用字符串来定位属性名,实现属性的批量生成、读写

语言本身对其语言构件都是有着一定的行为约束的。约束越少,允许我们“自定义”的程度越大,那么这门语言就越灵活、越不可控、越容易进行元编程。

在 JS 中,访问一个未定义变量 a 会报:Uncaught ReferenceError: a is not defined,访问一个未定义对象属性会返回 undefined ,访问一个未定义方法 f 会报:Uncaught TypeError: f is not a function。如果你表示不满,想要自定义出错的默认行为,那么除了 try-catch 外没有什么办法了。然而在 Ruby 中这些行为也是可以操纵的:通过修改 method_missingconst_missing 就可以自定义出错的默认行为,这使语言更灵活,同时衍生出“幽灵方法”、“动态代理”等一系列高级技巧,这些也是典型的元编程。

当然,JS 使用 try-catch 也不是不能实现同样的功能,只是很麻烦———— Ruby 中提供了语法糖一样的存在,对于元编程更加友好。Ruby 这门语言实在是太灵活了,你几乎可以操纵一切。

ES7 中的 Proxy 用于拦截、修改某些操作的默认行为,是典型的元编程增强。

“根本没有什么元编程,只有编程而已。”

λ 表达式

lambda 表达式,通常指一个匿名函数。比如:function(a,b) {return a+b}。ES6 中可以这样写了:(a,b) => a+b。一个听起来高大上然而我们每天都在用的东西。

其实我们写 JS 的更容易理解什么是 λ 表达式呢。

附两张看书时所记的脑图。

Ruby元编程

Ruby基础