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

Erlang参数化Module声明

阅读更多
浏览Mochiweb的源代码的时候,发现了一个比较陌生的module声明。
在erlang的maillist中找到了答案!网上有两篇文章对其进行了描述,这里简单概述一下,具体可以参看原文:
http://www.clickcaster.com/items/the-black-art-of-erlangs-parameterized-modules
http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang

在模块的attribute声明中,我们可以采用这样的形式:

-module(fruit, [Param1, Param2]).
-export([show/0]).
show() ->
	io:format("fruit:~p~p~n", [Param1, Param2]).


这里声明了Module fruit,同时指明了传递给fruit的参数:Param1,Param2。erlang的编译器会自动的export一个Name:new的函数,因此我们可以这样使用此Module:

Module = fruit:new("Apple", "Banana"),
Module:show().


也可以使用这种方式进行调用:

{fruit, "Apple", "Banana"}:show().


这个特性有点类似OOP语言中,对象的创建。在erlang中,其实完全可以通过record作为参数传递,来实现同样的功能。因此在某些erlang ”纯粹者“严重,这样的新特性值得怀疑。
分享到:
评论

相关推荐

    erlang四大behaviour之四-supervisor

    为了定义一个Supervisor,我们需要创建一个新的Erlang模块,并声明它遵循`supervisor`行为。具体来说: 1. **模块定义**: ```erlang -module(ch_sup). -behaviour(supervisor). -export([start_link/0]). -...

    erlang 入门练习

    Erlang的函数定义通常以`-module(ModuleName).`开始,然后定义函数,如`-export([FunctionName/Arity]).`导出函数,`FunctionName/Arity`表示函数名和参数个数。函数体由`fun FunctionName(Arguments) -> Body end`...

    Erlang入门:构建application练习5(监督树)

    创建一个基本的supervisor,我们需要定义一个行为模块,实现`behaviour()`声明为`supervisor`,并提供`init/1`回调来初始化进程树。`init/1`回调返回一个tuple,其中包含启动策略和进程定义列表。 ```erlang -...

    Erlang编程中文学习手册.pdf

    在Erlang Shell中,调用模块`double`函数的方式是通过模块名后跟函数名和参数,如`tut:double(10).`。 Erlang编程强调了函数的不可变性和无副作用原则,这使得函数能够更安全地并发执行,是构建并发和分布式系统的...

    Erlang中文手册

    - **多条目函数**: 一个函数可以有多个入口点(clauses),根据传入的不同参数执行不同的代码路径。 - **元子 (Atoms)**: - **定义**: Atoms 是不可变的数据类型,用于标识符号。 - **用途**: 常用于标识常量、...

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

    Erlang的模块通常遵循一定的命名规则,如`Module_Name`对应`module_name.erl`文件。`shuangseqiu`可能是模块名,里面定义了与双色球相关的函数,比如`start/0`(启动程序),`generate/0`(生成号码),以及可能的...

    Erlang Reference Manual

    字符串化宏参数是指将宏参数转换为字符串的过程。手册中详细介绍了字符串化宏参数的方法及应用场景。 ### 1.8 记录 **1.8.1 定义记录** 记录是一种具有命名字段的数据结构,用于表示具有固定字段集的对象。手册中...

    Erlang实现遗传算法.docx

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

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

    Erlang的函数可以接受任意类型的参数,并且可以利用模式匹配来对函数的参数进行检查和解构。模式匹配是Erlang一种非常强大的特性,它允许开发者根据参数的结构来控制程序的执行流程。模式匹配不涉及传统的条件判断,...

    erlmonads:Erlang 的语法扩展提供了 do-notation 和 Monads

    从版本 OTP 16 开始不再支持参数化模块的。 介绍 Erlmonads 是 Erlang 的一组语法扩展。 目前它由三个语法扩展组成,所有这些都采用的形式。 Cut :这为 Erlang 增加了对cut的支持。 这些灵感来自于 。 Cut可以被...

    E语言源码目录树演示.zip

    2. **src**:源代码文件通常放在这里,以.erl为扩展名,例如`module.erl`代表一个名为`module`的Erlang模块。 3. **include**:这个目录用于放置头文件,通常包含常量定义和类型声明,以.hrl为扩展名。 4. **test*...

    gen_udt:实现 UDT 协议的 Erlang 模块

    在使用`gen_udt`时,可以调整UDT的参数来优化性能,例如设置窗口大小、超时时间等。此外,利用Erlang的调试工具,如`dbg`模块,可以跟踪和分析UDT连接的性能问题。 总结,`gen_udt`是Erlang中实现UDT协议的模块,它...

    rexbug:Redbug Erlang跟踪调试器的瘦Elixir包装器

    1. **配置跟踪**: `rexbug`允许开发者自定义跟踪模式,可以指定要监视的模块、函数、调用参数,以及要收集的数据类型,如函数返回值、堆栈跟踪等。 2. **简单API**: 通过Elixir友好的API,开发者可以轻松地启动和...

    kissy模块化实践

    **语言层面的支持**:多种编程语言提供了对模块化的内置支持,如Pascal的程序分割、Erlang的进程间通信、Perl和Python的包管理、Ruby的模块和类、PHP的命名空间、Java的类和包、C/C++的头文件和源文件等。...

    sheehy_factory-webmachine

    3. **函数行为(Function Behavior)**:在Webmachine中,资源家族中的函数必须遵循一种统一的接口,即接收请求数据(`ReqData`)和状态(`State`)作为参数,并返回一个包含结果值(`RetV`)的新请求数据和状态。...

    各种程序语言的Hello_World程序

    - `string[] args`参数列表用于接收命令行参数。 #### Eiffel ```eiffel class HELLO_WORLD creation make feature make is local iBASIC_IO do !!iBASIC_IO iBASIC_IO.put_string ("%NHello World!") end...

    夏宇闻老师的讲稿

    #### Defparam定义参数声明语句 `defparam` 语句用于定义参数,可以在不重新编译的情况下更改已定义的参数。例如: ```verilog defparam WIDTH = 8; ``` #### Delay时延 `#delay` 用于为Verilog语句添加延迟时间。...

    引导程序:逐步引导Elixir应用程序(受RabbitMQ启发)

    `lib`中的`*.ex`文件定义了应用的主要模块,而`config`目录下的配置文件用于设置应用的环境变量和启动参数。 2. **应用元数据**: 每个Elixir应用都有一个名为`mix.exs`的文件,其中包含了关于应用的信息,如名称...

    前-子手

    1. **模块和函数** - Elixir代码主要由模块(Module)和函数(Function)组成,每个模块可以包含多个函数,函数是Elixir的基本执行单元。 2. **模式匹配** - Elixir支持强大的模式匹配,允许在函数定义中直接匹配...

    ELIXIR:lix剂含量

    Elixir的模块系统(Module)是其结构化编程的基础。每个模块可以包含常量、函数和行为,通过`def`定义函数,`defmodule`定义模块,`defprotocol`定义协议,我们能够构建出清晰、可复用的代码结构。模块间的依赖管理...

Global site tag (gtag.js) - Google Analytics