erlang两种参数模块化

在此只记录参数模块化的两种方式。根基自己的理解命名为“显示”和“隐式”两种

参考文档

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 :)


在此谢谢 立涛老大的解释

 附近是相关文档

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值