`
langzhe
  • 浏览: 288188 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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


在此谢谢 立涛老大的解释

 附近是相关文档

 

 

1
0
分享到:
评论

相关推荐

    erlang英文手册+中文教程

    OTP是Erlang的一个重要框架,提供了许多预定义的行为模式和库,如GenServer、GenEvent、Supervisor等,它们帮助开发者遵循良好的软件工程实践,实现模块化、容错和监控。 **Erlang的手册与中文教程** `...

    Erlang中的模块与模式匹配介绍

    Erlang提供了两种异常捕捉机制:try-catch和catch。try-catch表达式用于捕获异常并获取概括信息,而catch表达式提供了详细的栈跟踪信息,这对于调试和错误处理非常有用。例如: ```erlang try some_function() ...

    erlang r17官方api及stdlib手册

    Erlang是一种面向并发的、函数式编程语言,主要用于构建分布式、容错性强的系统。R17是Erlang的一个版本,它包含了对先前版本的改进和新特性。本手册是Erlang R17的官方API及stdlib文档,为开发者提供了详尽的函数...

    Erlang编写的生成一注双色球小程序

    4. **模块化编程**: 文件`shuangseqiu.erl`表示这是一个Erlang模块,其中包含了函数定义。通常,双色球生成的逻辑会被封装在一个或多个函数中,比如`generate_numbers/0`,它返回一个包含六红一蓝的双色球号码列表...

    Erlang Reference Manual

    手册中详细解释了这两种数据类型的使用方法和应用场景。 **1.2.5 引用(Reference)** 引用是一种由运行时系统生成的唯一标识符,主要用于并发控制。手册中介绍了引用的概念、生成方式及其在并发编程中的应用。 **...

    getting_started_erlang-5.4.pdf

    - **If** 和 **Case** 是用于控制流的两种主要结构。If 语句根据条件执行不同的代码块,而 Case 语句则基于模式匹配来选择执行路径。 ##### 3.12 内置函数(BIFs) - **内置函数(BIFs)** 是 Erlang 标准库中提供...

    Erlang实现遗传算法.docx

    1. **初始化**: 随机生成一定数量的个体(通常称为染色体),这些个体构成了初始种群。 2. **适应度评价**: 对种群中的每个个体进行适应度评价,该值反映了个体解决特定问题的能力。 3. **选择**: 根据个体的适应度...

    MQTT Erlang server:用Erlang编写的用于物联网的MQTT服务器-开源

    6. `start_mqtt_server.sh`和`start_console.sh`:这两个脚本可能是启动MQTT服务器和Erlang控制台的命令,方便开发者调试和管理服务器。 7. `src`目录:这里包含了项目的源代码,Erlang模块和函数应该在这里定义,...

    gen_udt:实现 UDT 协议的 Erlang 模块

    - **数据传输**:可以发送和接收UDT数据包,支持阻塞和非阻塞两种模式。 - **错误处理**:包括连接异常、数据包丢失等错误的处理机制。 - **性能监控**:提供统计信息,如传输速率、丢包率等,便于性能调优。 **4. ...

    erlang-deploy:Sqor 如何部署 Erlang 代码

    Erlang 是一种高度并发、面向进程的编程语言,常用于构建分布式系统,尤其是在高可用性和容错性方面表现出色。在本篇文章中,我们将深入探讨 Sqor 如何部署 Erlang 代码,以便在实际环境中运行和管理 Erlang 应用...

    Clique:erlang中的并行最大集团

    Erlang 是一种由 Ericsson 公司开发的函数式编程语言,特别适合用于构建高并发、分布式和容错的系统。它具有轻量级进程(processes)和消息传递机制,使得并行计算变得相对容易和高效。 描述中提到的“并行计算课程...

    Mnesia用户手册(docx版)

    - **数据模型**:Mnesia 支持两种主要的数据模型:*正交表(Table)* 和 *活动数据表(Active Data Table, ADT)*。正交表用于存储静态数据,而ADT则用于动态数据,支持实时更新和查询。 - **启动 Mnesia**:启动...

    Python 学习文档

    LISP和Erlang是两种常见的函数式编程语言。函数式编程中常常使用的技术包括尾递归,这可以有效地优化递归调用的性能,避免堆栈溢出等问题。 #### 实体关系模型(ER模型) 实体关系模型是一种用于描述数据结构的概念...

    无涯教程(LearnFk)-函数式编程教程离线完整版.pdf

    通过模块和导出的函数来实现代码的封装和模块化。 总之,函数式编程是一种强大的编程范式,它提供了一种与命令式编程截然不同的思考问题和解决问题的方式。通过利用数学函数的概念,函数式编程使得程序更加易于理解...

    qcstm:基于QCheck的OCaml的简单状态机框架

    QCSTM:基于QCheck的OCaml的简单状态机框架 该库实现了一个... 作为其参数,函子需要一个指定3种类型的模块: cmd :命令类型state :模型状态的类型sut :被测系统的类型此外,用户还必须提供: arb_cmd :命令生成

    deigma:事件采样器

    Erlang和Elixir是两种被广泛用于构建高并发、分布式系统和实时系统编程语言。deigma作为事件采样器,可能利用这两种语言的特性,如Erlang的轻量级进程和Elixir的并发模型,来高效地处理大量并发事件。 **标签详解**...

    函数式编程另类指南.pdf

    函数式编程作为一种强大的编程范式,不仅提供了更为简洁优雅的代码结构,还促进了软件开发的模块化和可复用性。尽管存在一定的学习门槛,但对于希望提高代码质量和维护性的开发者来说,掌握函数式编程的基本原理是...

    linit:非常简单的退避初始化器

    通过提供的使用示例,我们可以看到`worker(Linit, [fn() -> :do_it end, ms: 1000])`,这表示`Linit`被用作一个工作进程,接收两个参数:一个函数(`fn() -> :do_it end`)和一个时间间隔(`ms: 1000`)。...

Global site tag (gtag.js) - Google Analytics