我正在浏览 mochiweb 源代码,并看到了一些我以前从未使用过的东西。模块声明,尤其是mochiweb http 库中mochiweb_request
的模块声明。mochiweb_response
以下是模块的开始方式:
-module(mochiweb_request,[Socket, Method, RawPath, Version, Headers])。 -作者(...)。
然后在你看到的模块中get(socket) -> Socket;get(method)-> Method; ....
这让我很困惑。当我尝试获取其中一个此类模块的模块信息时,编译器添加了一些内容:{abstract,true}
在返回:
mochiweb_request:module_info().
. 事实上,他们的文档将这些模块称为abstract modules
.
我搜索了谷歌并找到了一篇关于参数化模块的论文:链接很大,但如果你继续关注这里,我相信你会得到这篇论文
这些模块不能直接调用,而是通过它们自身的实例调用。它使模块表现得好像它们很有趣。我开始意识到它是运行时系统中的一个非官方特性。让我感到困惑的是,mochiweb 的人用得很好!在 mochiweb 模块中,您会发现自己在编写:
循环(请求,_DocRoot)-> "/" ++ 路径 = Req:get_path(), 正文 = 请求:recv_body(), 方法 = 请求:获取(方法), ..., ....., 响应 = Req:ok({"text.html;charset=utf-8",[],chunked}), Response:write_chunk("这里有一些文字....."), ...
试图 io:format("\n\t Req = ~p~n",[Req])
揭示一个复杂的数据结构(元组),其element(1,Req) == mochiweb_request
. 挺有趣的!?!!!?
问题1是:现在在生产中使用是否稳定,或者我可以等到它正式发布?
问题 2:如果 mochiweb 尚未正式发布,mochiweb 人是如何获得使用它的信心的?
问题3:为什么还没有正式发布?(因为,对我来说,它带来了一些面向对象的特性)
问题 4:有没有人也使用过它?他/她在哪些情况下使用了这些参数化模块?为什么?您能指出我们那里查看或发布指向某些源代码的链接,以便我们了解有关此功能的更多信息吗?
最后一个问题:我在 Erlang Docs 的任何地方都没有发现这个特性。没有课本,连家也没有. 那么那些使用过它的人是如何知道如何以及为什么要使用它的呢?它是否已经包含在此处找到的 Erlang Run time 系统的商业版本中?