浏览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 ”纯粹者“严重,这样的新特性值得怀疑。
分享到:
相关推荐
为了定义一个Supervisor,我们需要创建一个新的Erlang模块,并声明它遵循`supervisor`行为。具体来说: 1. **模块定义**: ```erlang -module(ch_sup). -behaviour(supervisor). -export([start_link/0]). -...
Erlang的函数定义通常以`-module(ModuleName).`开始,然后定义函数,如`-export([FunctionName/Arity]).`导出函数,`FunctionName/Arity`表示函数名和参数个数。函数体由`fun FunctionName(Arguments) -> Body end`...
创建一个基本的supervisor,我们需要定义一个行为模块,实现`behaviour()`声明为`supervisor`,并提供`init/1`回调来初始化进程树。`init/1`回调返回一个tuple,其中包含启动策略和进程定义列表。 ```erlang -...
在Erlang Shell中,调用模块`double`函数的方式是通过模块名后跟函数名和参数,如`tut:double(10).`。 Erlang编程强调了函数的不可变性和无副作用原则,这使得函数能够更安全地并发执行,是构建并发和分布式系统的...
- **多条目函数**: 一个函数可以有多个入口点(clauses),根据传入的不同参数执行不同的代码路径。 - **元子 (Atoms)**: - **定义**: Atoms 是不可变的数据类型,用于标识符号。 - **用途**: 常用于标识常量、...
Erlang的模块通常遵循一定的命名规则,如`Module_Name`对应`module_name.erl`文件。`shuangseqiu`可能是模块名,里面定义了与双色球相关的函数,比如`start/0`(启动程序),`generate/0`(生成号码),以及可能的...
字符串化宏参数是指将宏参数转换为字符串的过程。手册中详细介绍了字符串化宏参数的方法及应用场景。 ### 1.8 记录 **1.8.1 定义记录** 记录是一种具有命名字段的数据结构,用于表示具有固定字段集的对象。手册中...
1. **初始化**: 随机生成一定数量的个体(通常称为染色体),这些个体构成了初始种群。 2. **适应度评价**: 对种群中的每个个体进行适应度评价,该值反映了个体解决特定问题的能力。 3. **选择**: 根据个体的适应度...
Erlang的函数可以接受任意类型的参数,并且可以利用模式匹配来对函数的参数进行检查和解构。模式匹配是Erlang一种非常强大的特性,它允许开发者根据参数的结构来控制程序的执行流程。模式匹配不涉及传统的条件判断,...
从版本 OTP 16 开始不再支持参数化模块的。 介绍 Erlmonads 是 Erlang 的一组语法扩展。 目前它由三个语法扩展组成,所有这些都采用的形式。 Cut :这为 Erlang 增加了对cut的支持。 这些灵感来自于 。 Cut可以被...
2. **src**:源代码文件通常放在这里,以.erl为扩展名,例如`module.erl`代表一个名为`module`的Erlang模块。 3. **include**:这个目录用于放置头文件,通常包含常量定义和类型声明,以.hrl为扩展名。 4. **test*...
在使用`gen_udt`时,可以调整UDT的参数来优化性能,例如设置窗口大小、超时时间等。此外,利用Erlang的调试工具,如`dbg`模块,可以跟踪和分析UDT连接的性能问题。 总结,`gen_udt`是Erlang中实现UDT协议的模块,它...
1. **配置跟踪**: `rexbug`允许开发者自定义跟踪模式,可以指定要监视的模块、函数、调用参数,以及要收集的数据类型,如函数返回值、堆栈跟踪等。 2. **简单API**: 通过Elixir友好的API,开发者可以轻松地启动和...
**语言层面的支持**:多种编程语言提供了对模块化的内置支持,如Pascal的程序分割、Erlang的进程间通信、Perl和Python的包管理、Ruby的模块和类、PHP的命名空间、Java的类和包、C/C++的头文件和源文件等。...
3. **函数行为(Function Behavior)**:在Webmachine中,资源家族中的函数必须遵循一种统一的接口,即接收请求数据(`ReqData`)和状态(`State`)作为参数,并返回一个包含结果值(`RetV`)的新请求数据和状态。...
- `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语句添加延迟时间。...
`lib`中的`*.ex`文件定义了应用的主要模块,而`config`目录下的配置文件用于设置应用的环境变量和启动参数。 2. **应用元数据**: 每个Elixir应用都有一个名为`mix.exs`的文件,其中包含了关于应用的信息,如名称...
1. **模块和函数** - Elixir代码主要由模块(Module)和函数(Function)组成,每个模块可以包含多个函数,函数是Elixir的基本执行单元。 2. **模式匹配** - Elixir支持强大的模式匹配,允许在函数定义中直接匹配...
Elixir的模块系统(Module)是其结构化编程的基础。每个模块可以包含常量、函数和行为,通过`def`定义函数,`defmodule`定义模块,`defprotocol`定义协议,我们能够构建出清晰、可复用的代码结构。模块间的依赖管理...