[转]参数化的module
November 6th, 2007 :: jackyz
Tony Arcieri 写了一篇 《The black art of Erlang’s parameterized modules》。介绍了“参数化的 module”(parameterized modules)这是一种“undocumented and unsupported feature”。
这种机制就好比,你有了 module 的一个 instance 。没错,就是在 oop 中非常常见的 instance (实例)。具体的,这种语法是这样的:
声明一个 parameterized module:
- -module(foo,[Bar, Baz]).
这样声明的 module 会自动 export 一个 new 函数(多像 method),可以这么用:
- Module = foo:new("Bar", "Baz"),
- Module:quux().
that’s all.
一个“类”实例化多个“对象”,每个实例保持一个自己的“状态”,各个“对象”的“方法”在自己的“状态”中执行。——这是 OOP 下的“标准思维方法”。在 MochWeb toolkit 中,就应用了这种语言机制来保存每一个 request 。
这是一种 Erlang 的语法糖,很好的模拟了 OOP way 的编程思路。而实际上,通过参照作者自己写的“文档”。你会发现,他仍是用 Erlang 的标准方式(behaviour)来实现的,并没有从语法层面做出什么本质的改变。另外要注意的问题是它是“undocumented and unsupported”的特性,所以“use at your own risk”,非官方支持的特性,并没有什么保证。
顺便提一句,在 EShell 中,不能直接使用这个语法,而必须是从某个 module 来调用。
这个是艺术层面的技术 感觉掌握不了。
@mryufeng
这是很 OOP way 的语法糖,与 Erlang 所主导的 COP way 很不相同。不过对于 Java/Ruby/… 阵营的同学们来说,看着这样的 new() 就会感觉很亲切。从语言推广的角度来看,也许会有助于他们降低对于 Erlang 的学习曲线也说不定。
使用一门语言就要接受他的语法,应往别的语言上套没啥好结果。
多一种选择也不错嘛,呵呵
请参看模块参数化的剖析 http://mryufeng.javaeye.com/blog/477376