在此只记录参数模块化的两种方式。根基自己的理解命名为“显示”和“隐式”两种
参考文档
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 :)
在此谢谢 立涛老大的解释
附近是相关文档
分享到:
相关推荐
OTP是Erlang的一个重要框架,提供了许多预定义的行为模式和库,如GenServer、GenEvent、Supervisor等,它们帮助开发者遵循良好的软件工程实践,实现模块化、容错和监控。 **Erlang的手册与中文教程** `...
Erlang提供了两种异常捕捉机制:try-catch和catch。try-catch表达式用于捕获异常并获取概括信息,而catch表达式提供了详细的栈跟踪信息,这对于调试和错误处理非常有用。例如: ```erlang try some_function() ...
Erlang是一种面向并发的、函数式编程语言,主要用于构建分布式、容错性强的系统。R17是Erlang的一个版本,它包含了对先前版本的改进和新特性。本手册是Erlang R17的官方API及stdlib文档,为开发者提供了详尽的函数...
4. **模块化编程**: 文件`shuangseqiu.erl`表示这是一个Erlang模块,其中包含了函数定义。通常,双色球生成的逻辑会被封装在一个或多个函数中,比如`generate_numbers/0`,它返回一个包含六红一蓝的双色球号码列表...
手册中详细解释了这两种数据类型的使用方法和应用场景。 **1.2.5 引用(Reference)** 引用是一种由运行时系统生成的唯一标识符,主要用于并发控制。手册中介绍了引用的概念、生成方式及其在并发编程中的应用。 **...
- **If** 和 **Case** 是用于控制流的两种主要结构。If 语句根据条件执行不同的代码块,而 Case 语句则基于模式匹配来选择执行路径。 ##### 3.12 内置函数(BIFs) - **内置函数(BIFs)** 是 Erlang 标准库中提供...
1. **初始化**: 随机生成一定数量的个体(通常称为染色体),这些个体构成了初始种群。 2. **适应度评价**: 对种群中的每个个体进行适应度评价,该值反映了个体解决特定问题的能力。 3. **选择**: 根据个体的适应度...
6. `start_mqtt_server.sh`和`start_console.sh`:这两个脚本可能是启动MQTT服务器和Erlang控制台的命令,方便开发者调试和管理服务器。 7. `src`目录:这里包含了项目的源代码,Erlang模块和函数应该在这里定义,...
- **数据传输**:可以发送和接收UDT数据包,支持阻塞和非阻塞两种模式。 - **错误处理**:包括连接异常、数据包丢失等错误的处理机制。 - **性能监控**:提供统计信息,如传输速率、丢包率等,便于性能调优。 **4. ...
Erlang 是一种高度并发、面向进程的编程语言,常用于构建分布式系统,尤其是在高可用性和容错性方面表现出色。在本篇文章中,我们将深入探讨 Sqor 如何部署 Erlang 代码,以便在实际环境中运行和管理 Erlang 应用...
Erlang 是一种由 Ericsson 公司开发的函数式编程语言,特别适合用于构建高并发、分布式和容错的系统。它具有轻量级进程(processes)和消息传递机制,使得并行计算变得相对容易和高效。 描述中提到的“并行计算课程...
- **数据模型**:Mnesia 支持两种主要的数据模型:*正交表(Table)* 和 *活动数据表(Active Data Table, ADT)*。正交表用于存储静态数据,而ADT则用于动态数据,支持实时更新和查询。 - **启动 Mnesia**:启动...
LISP和Erlang是两种常见的函数式编程语言。函数式编程中常常使用的技术包括尾递归,这可以有效地优化递归调用的性能,避免堆栈溢出等问题。 #### 实体关系模型(ER模型) 实体关系模型是一种用于描述数据结构的概念...
通过模块和导出的函数来实现代码的封装和模块化。 总之,函数式编程是一种强大的编程范式,它提供了一种与命令式编程截然不同的思考问题和解决问题的方式。通过利用数学函数的概念,函数式编程使得程序更加易于理解...
QCSTM:基于QCheck的OCaml的简单状态机框架 该库实现了一个... 作为其参数,函子需要一个指定3种类型的模块: cmd :命令类型state :模型状态的类型sut :被测系统的类型此外,用户还必须提供: arb_cmd :命令生成
Erlang和Elixir是两种被广泛用于构建高并发、分布式系统和实时系统编程语言。deigma作为事件采样器,可能利用这两种语言的特性,如Erlang的轻量级进程和Elixir的并发模型,来高效地处理大量并发事件。 **标签详解**...
函数式编程作为一种强大的编程范式,不仅提供了更为简洁优雅的代码结构,还促进了软件开发的模块化和可复用性。尽管存在一定的学习门槛,但对于希望提高代码质量和维护性的开发者来说,掌握函数式编程的基本原理是...
通过提供的使用示例,我们可以看到`worker(Linit, [fn() -> :do_it end, ms: 1000])`,这表示`Linit`被用作一个工作进程,接收两个参数:一个函数(`fn() -> :do_it end`)和一个时间间隔(`ms: 1000`)。...