在此只记录参数模块化的两种方式。根基自己的理解命名为“显示”和“隐式”两种
参考文档
http://erlang-china.org/study/parameterized-module.html
http://mryufeng.iteye.com/blog/477376
http://www.iteye.com/topic/348379
1、“显示”
以下内容来自yufeng的demo
root@nd-desktop:~/test/m# cat main.erl % File: main.erl -module(main). -export([start/0]). start() -> M1 = print:new("Humpty"), M2 = print:new("Dumpty"), M1:message("Hello!"), M2:message("Hi!"), ok. root@nd-desktop:~/test/m# cat print.erl % File: print.erl -module(print, [Name]). -export([message/1]). message(Text) -> io:fwrite("~s: '~s'~n", [Name, Text]), ok. 编译运行 root@nd-desktop:~/test/m# erlc *.erl root@nd-desktop:~/test/m# erl -noshell -s main -s erlang halt Humpty: 'Hello!' Dumpty: 'Hi!'
2、“隐式
1 -module(main).
2 -export([start/0]).
3 start()->
9 {print,"lang"}:message(),
10 ok.
1 -module(print).
2 %-module(print,[Name]).
3 -export([message/1]).
5 message(Text) ->
6 io:format("Text=~p~n",[Text]), %%不知道为什么只有一个参数就够了
8 ok.
运行结果
52> main:start().
Text={print,"lang"}
ok
53>
立涛 10:05:50
这个new是erlang自动生成的...
立涛 10:06:12
你看看misultin_ws的-module声明哦。
立涛 10:07:37
在$ erl
>m(misultin_ws). 就看到new了。
Android郎哲 10:08:44
-module(misultin_ws). 也没什么特别之处
Android郎哲 10:09:43
可否说说 原理
立涛 10:10:11
你的misultin啥版本啊?没啥原理,这个就是一个没有书面化的语法。
Android郎哲 10:10:11
这是我用m()看的
Exports:
get/2
module_info/0
module_info/1
raw/1
send/2
Android郎哲 10:10:37
30 -module(misultin_ws).
31 -vsn("0.8-dev").
Android郎哲 10:11:36
-module(misultin).
34 -behaviour(gen_server).
35 -vsn("0.7.1").
Android郎哲 10:11:48
这是我的两个版本
你用的哪个版本
立涛 10:12:05
稍等,我看的0.6
立涛 10:12:20
我看下github
Android郎哲 10:12:20
这个语法 哪个地方能查到
Android郎哲 10:12:25
OK 谢谢
立涛 10:12:54
mochiweb也有这个用法,在erlang maillist中有说明。
Android郎哲 10:14:51
-module(misultin_ws, [Ws, SocketPid]).
-vsn("0.6.2").
这是 低版本
立涛 10:27:03
hi
立涛 10:27:17
它现在代码没有使用-module(misultin_ws, [Ws, SocketPid]).
立涛 10:27:33
但是代码还是参数化模块。。。
Android郎哲 10:29:11
hi 在
给我讲一下这个语法吧,我现在翻不了墙
Android郎哲 10:31:05
谢谢了 网上找到相关资料了
立涛 10:31:16
-module(Modue, [P1, P2]). 声明一个参数化模块,
然后可以通过 Module:new(P1, P2),来生成这个模块.
也可以这样:
-module(Module),不指明参数,
但是在接口的定义中加入参数如:
some_fun(P1, P2) -> ok.
这样调用{Module, P1, P2}:some_fun().
立涛 10:31:41
现在misultin是用的第二种方法,比较的变态。
Android郎哲 10:32:39
立涛 10:33:16
看了会misultin的代码,真乱...
Android郎哲 10:34:03
同感 且代码基本都一行 下来的
立涛 10:34:21
恩,不推荐阅读。
立涛 10:34:44
里面还N多元是的消息 !, receive,太容易出错了。
立涛 10:34:50
原始的
Android郎哲 10:35:35
恩 想用它来搭建个测试服务器玩玩websocket
Android郎哲 10:35:49
参数化得模块 有什么好处
立涛 10:37:06
好处就是不用每个函数都写那个参数。
立涛 10:37:16
你可以看看mochiweb_request那个模块.
立涛 10:37:52
它可以将接收的http请求,解析完后,作为一个参数传递给mochiweb_req模块
Android郎哲 10:37:52
好
立涛 10:38:36
这样我就得到一个Req“对象”, 我就直接可以通过 Req:header(), Req:peer()这样的接口来获取http请求的信息了。
立涛 10:38:47
有点面向对象的感觉。
Android郎哲 10:38:57
恩 似乎是在传对象
立涛 10:39:40
恩,是的。一个语法糖。
Android郎哲 10:39:59
OK了 明白怎么回事了
立涛 10:40:00
一个数据好像成了模块的内部成员
立涛 10:40:03
恩。
Android郎哲 10:40:29
谢谢 你忙吧 我再查查相关资料
立涛 10:41:27
k :)
附近是相关文档