编辑:史蒂夫Vinoski在评论中提供了正式的名称:元组模块.
我的原始问题仍然存在:OTP团队正式记录的元组模块是什么?他们预计未来会继续受到支持吗?
原始问题:
考虑以下erlang模块:
-module(foo).
-compile(export_all).
new(Bar) -> {foo, Bar}.
get({foo, Bar}) -> Bar.
Run Code Online (Sandbox Code Playgroud)
看到它允许以下内容(使用erlang 19.1),我感到非常惊讶:
2> Foo = foo:new(bar).
{foo,bar}
3> Foo:get().
bar
Run Code Online (Sandbox Code Playgroud)
这与调用模块函数的常用方法有很大不同.
据我所知,它似乎是参数化模块的残余,自R16以来已被弃用; 我在官方文档中找不到任何内容,说明这是该语言支持的稳定功能.
我的问题是:这是该语言的文档功能吗?如果是的话,在哪里?
我正在浏览mochiweb源代码并且看到了以前从未使用过的东西.该模块声明尤其是在mochiweb_request和mochiweb_response模块在了Mochiweb HTTP库中找到.以下是模块的开始:
-module(mochiweb_request,[Socket, Method, RawPath, Version, Headers]). -author(...).
然后在模块中你看到get(socket) -> Socket;get(method)-> Method; ....
这让我很困惑.当我尝试获取其中一个这样的模块的模块信息时,编译器添加了一些东西:{abstract,true}在返回:
mochiweb_request:module_info()..事实上,他们的文档将这些模块称为abstract modules.
我搜索了谷歌并找到了一篇关于参数化模块的论文:链接太大了但是你肯定如果你在这里继续那么你会得到论文
这些模块不能直接调用,而是通过它们的实例调用.它使模块表现得像是乐趣.我已经意识到它是运行时系统中的一个非官方特性.令我困惑的是,mochiweb的家伙们正在使用它!在mochiweb模块中,您将找到自己的写作:
loop(Req,_DocRoot)->
"/" ++ Path = Req:get_path(),
Body = Req:recv_body(),
Method = Req:get(method),
...,
....,
Response = Req:ok({"text.html;charset=utf-8",[],chunked}),
Response:write_chunk("Some text here....."),
...
试图 io:format("\n\t Req = ~p~n",[Req])揭示一个复杂的数据结构(一个元组)element(1,Req) == mochiweb_request.挺有趣的!?!!!?
问题1是:现在在生产中使用是否稳定,或者我可以等到正式生产?
问题2是:如果mochiweb家伙尚未正式使用它,他们是如何获得使用它的信心的?
问题3:为什么它还没有正式发布?(因为,对我来说,它带来了一些面向对象的功能)
问题4:那里有没有人使用过它?他/她在哪些情况下使用这些参数化模块?为什么?你能指点我们看看或发布一些源代码的链接,以便我们可以找到更多有关此功能的信息吗?
最后一个问题:没有在Erlang Docs中我发现了这个功能.没有教科书,甚至没有回家.那么使用它的人是如何找到使用它的方式和原因的呢?它是否已经包含在此处的Erlang Run时间系统的商业版本中?
创建像Active Record或Hibernate这样的ORM会很好,它应该像这样处理链式查询:
User = User:new():for_login(«stackoverflow_admin»):for_password(«1984»):load().
Run Code Online (Sandbox Code Playgroud)
我们应该怎么做?或者就像那样,在一条线上 - 或者至少在精神和意义上相似.
也许有一些预处理工具可以帮助解决这个问题?