介绍Erlang里的Record

原文: [url=http://20bits.com/2008/06/15/erlang-an-introduction-to-records/]Erlang: An Introduction to Records[/url]

在Erlang内部只有两种混合的数据类型:List和Tuple,而这两种都不支持命名访问,所以如果没有额外的库的话想创建像PHP、Ruby或Python中的关联数组(Ruby中的Hash)是不可能的
在Ruby中我可以这样做:
[code]
server_opts = {:port => 8080, :ip => '127.0.0.1', :max_connections => 10}
[/code]
在Erlang的语法级别不支持这种表达

为了避免这种限制,Erlang虚拟机提供了一个伪数据类型,称为Record
Record支持命名访问,后面我们会看到为什么我们称之为“伪”数据类型

[b]定义Record[/b]
Record更类似于C中的struct,而不是关联数组,后者必须一开始就定义好内容并且只能保持数据
这里是一个服务器的连接选项的Record例子:
[code]
-module(my_server).

-record(server_opts,
{port,
ip="127.0.0.1",
max_connections=10}).

% The rest of your code goes here.
[/code]
Record使用-record指令来声明,第一个参数是Record的名字,第二个参数是一个Tuple,Tuple包含了Record里的field和默认值
在这里我们定义了server_opts这个Record,它有三个field:端口、IP和最大连接数
没有默认的port,ip默认值为"127.0.0.1",max_connections默认值为10

[b]创建Record[/b]
Record通过使用#符号来创建,下面是创建server_opts这个Record的实例的合法方式:
[code]
Opts1 = #server_opts{port=80}.
[/code]
这段代码创建了一个server_opts Record,port设置为80,其他field使用默认值
[code]
Opts2 = #server_opts{port=80, ip="192.168.0.1"}.
[/code]
这段代码创建了一个server_opts Record,但是ip设置为"192.168.0.1"

简而言之,当创建一个Record时,你可以包含任何field,省略的field将使用默认值

[b]访问Record[/b]
Record的访问方式很笨拙,如果我想访问port这个field,我可以这样做:
[code]
Opts = #server_opts{port=80, ip="192.168.0.1"},
Opts#server_opts.port
[/code]
每次你想访问一个Record时你都必须包含Record的名字,为什么要这样?
因为Record不是真正的内部数据类型,它只是编译器的小把戏。

在内部,Record是Tuple,如下:
[code]
{server_opts, 80, "127.0.0.1", 10}
[/code]
编译器将Record的名字映射到Tuple里面
Erlang虚拟机记录了Record的定义,而编译器将所有的Record逻辑翻译为Tuple逻辑
因此,根本就没有Record类型,所以每次你访问一个Record时你必须告诉Erlang我们在用哪个Record(为了编译器爽,程序员变的很不爽)

[b]更新Record[/b]
更新Record和创建Record很类似:
[code]
Opts = #server_opts{port=80, ip="192.168.0.1"},
NewOpts = Opts#server_opts{port=7000}.
[/code]
这里首先创建一个server_opts Record
NewOpts = Opts#{port=7000}创建了一个Opts的副本,并指定port为7000并绑定到NewOpts

[b]匹配Record和Guard语句[/b]
不谈模式匹配就不算Erlang
让我们来看看一个例子:
[code]
handle(Opts=#server_opts{port=8000}) ->
% do special port 8080 stuff
handle(Opts=#server_opts{} ->
% default stuff
[/code]
Guard语句和上面的类似,例如绑定小于1024的端口通常需要root权限,所以我们可以这样做:
[code]
handle(Opts) when Opts#server_opts.port <= 1024 ->
% requires root access
handle(Opts=#server_opts{}) ->
% Doesn't require root access
[/code]

[b]使用Record[/b]
在我使用Erlang的有限的时间里,我发现Record主要用在两种场景
首先,Record用来保存状态,特别是在使用gen_server的behaviour时
由于Erlang不能全局保持状态,所以状态必须在方法之前传来传去
然后,Record可以用来保存配置选项,这可以认为是第一点的子集
尽管如此,Record也有一些限制,最明显的是不能在运行时添加和删除field,这和C的struct一样,Record的结构必须预先定义
如果你想在运行时添加和删除field,或者你在运行时才能确定有哪些field,这时你应该使用[url=http://www.erlang.org/doc/man/dict.html]dict[/url]而不是Record
Erlang中ETS的一些用法总结 前言: ETS表是erlang为了解决大规模数据快速查询的一种机制。当你需要把大量的临时数据存储起来,又想避免大量的系统IO操作时,就可以用到ETS。 ETS表有自己的访问权限: 在建表的时候可以选择,public,protected,private三种,用于控制访问ETS表的权限。 ETS表的类型: set,ordered_set,duplicate_bag,bag 类型说明: 这 阅读详情

相关推荐

Erlang record指定字段查询

Erlang开发中record的使用的非常频繁,在eshell中我们又不好直接操作record,所以今天来构建一个能在eshell中查询record指定字段的工具

Nicer_feng's blog 433

Erlang学习总结之Erlang语法中的逗号(,)、分号(;),句号(.)的正确用法...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33721427的博客 689

立创开源Link Hub多功能USB扩展坞:CH339F主控+4层板设计,实测网口/存储性能

本文深度评测了立创开源Link Hub多功能USB扩展坞,其采用CH339F主控芯片与4层PCB板设计,并严格进行阻抗匹配。实测表明,该扩展坞的USB接口与microSD读卡器性能均接近USB 2.0理论极限,百兆以太网口转换效率高,性能损失极小。设计上注重电源保护与信号完整性,是一个兼顾稳定性与成本的高完成度开源硬件项目。

weixin_36173034的博客 156

erlang 中#(井号)号的作用

erlang语言 中#(井号)什么作用? - 知乎

1014

【视频编码学习】AVS3参考软件HPM-4.1简单配置运行

1、用Visual Studio2017打开HPM-4.1文件夹 2、找到文件夹目录下x86_windows文件夹,因为是在win上运行该代码 3、然后找到对应vs版本(我当时2017版)的解决方案sln文件,双击打开可以看到该解决方案下的全部项目。 4、重新生成解决方案时发现提示sdk版本问题,所以右键点击所有的项目,选择重定向项目,修改一下sdk版本。 ...

谦虚勤奋诚实感恩 3100

国产FPGA开发实战:紫光同创编程软件中的约束文件详解与常见问题

本文详细解析了紫光同创FPGA编程软件中约束文件的关键配置技巧与常见问题。通过基础架构解析、时钟约束实践、物理约束调控及典型问题排查指南,帮助开发者高效掌握国产FPGA开发中的约束文件应用,提升开发效率与设计稳定性。

gin88的博客 903

erlang的逗号和分号和句号区别

1.逗号(,)是用来区别同一个方法体内

无知的程序员 2344

用Charles抓包调试iOS应用?这份保姆级配置指南帮你绕过所有坑

本文提供了一份在Mac上使用Charles抓包调试iOS应用的保姆级配置指南。详细讲解了从Charles安装、Mac端代理设置、根证书安装,到iOS设备连接同一WiFi、配置代理以及最关键的系统证书信任等全流程步骤,并分享了SSL代理规则、断点调试等进阶技巧,帮助开发者高效定位和解决网络请求问题。

rice5的博客 639

Erlang中的record与宏

在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据项顺序调整或者增减字段,都容易出现badmatch.同时一些常量如果硬编码到代码中,一旦数值变化,要想全部可靠的替换成新的数值是一个困难的事情.这两种数据层面的变化,在Erlang中对应的解决方案是: record  Macro 一. record   记录的定义如下: -record(name_of_record,{...

wuzhan的专栏 886

山东大学软件学院计算机组成原理课程设计实验三

文章目录一、实验时间二、实验内容1. 实验目的2. 设计要求3. 实验基本思路三、电路图1. 可预置初值的模256异步计数器2. 8位ALU电路3. 总图四、补充 一、实验时间 第三次实验:2021年4月8日星期四,第六周 第一次部件级实验,开始算分 二、实验内容 微程序控制的运算器设计 1. 实验目的 (1)熟悉简单运算器的结构 (2)熟悉微命令的产生和时序 (3)熟悉运算器功能测试。 2. 设计要求 利用之前设计的具有超前进位功能的8位ALU,实现简单算术或逻辑运算 两操作数由八位寄存器R0、R1提供,

叶卡捷琳堡的博客 1万+

DSP TMS320C6657中FFT函数的调用与具体使用方法

首先明确一点,C6678中FFT的函数形式为: N : length of FFT in complex samples ptr_x : pointer to complex data input ptr_w : pointer to complex twiddle factor ptr_y : pointer to complex output data brev : pointer to bit reverse table containing 64 entries n_min : should be

Kayboy的博客 3011

【Erlang】学习笔记-erlang基础语法

一、关于erlang erlang是函数式编程语言,最初主要用在电信软件开发,他是面向并发编程的,和主流语言相比,主流语言并不能很好的利用多核CPU的资源,采取加锁的方式使得编程易出错,且锁也是耗资源的。学习erlang的过程中,发现erlang和主流语言的语法和思想差别很大,可能并不容易上手,但是作为一个程序员,越不容易才越有意思对不对?先从基本语法学起吧。 二、基本语法部分 2....

pointer_y的博客 3495

Win10/Win11共享打印机0x00000709终极修复指南:从注册表到LPD协议的全面解决方案

本文提供了Win10/Win11共享打印机0x00000709错误的终极修复指南,涵盖从注册表修改到LPD协议的全面解决方案。通过详细分析错误根源、基础修复四步法、高阶LPD协议方案及企业级深度修复策略,帮助用户彻底解决打印机共享问题,提升局域网打印效率。

weixin_33724046的博客 309

Erlang学习:介绍Erlang里的Record

转自:http://hideto.iteye.com/blog/241246 在Erlang内部只有两种混合的数据类型:List和Tuple,而这两种都不支持命名访问,所以如果没有额外的库的话想创建像PHP、Ruby或Python中的关联数组(Ruby中的Hash)是不可能的  在Ruby中我可以这样做:  Java代码   server_opts = {:port

【昆山人在上海】 727

投稿前利用GPT-5.5给论文做一次深度校对,投稿命中率翻倍!

3)一致性:请对比摘要的结论与正文(如果我也提供了正文),确保完全一致。请严格检查结果部分,确保客观性:1)纯粹性检查:标出所有包含“为什么”(解释)或“这意味着什么”(暗示)的主观语句,这些应移至讨论部分。请你帮我评估讨论部分的深度:1)解释与对比:检查每一项主要结果是否都解释了原因,并引用了前人研究进行对比(一致或相悖)。我见过太多人把校对理解为检查错别字了,实际上,校对要看的远不止这个,像逻辑是否连贯、术语是否前后一致、图表有没有被正确引用等等的这些细节,往往决定了文章是秒被拒,还是能顺利进入外审。

智能AI让学术科研更容易 412

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Erlang的记录record

使用元组编程时,如果元组的元素数量非常庞大,我们很难记住元组中每个元素的含义。 记录record就提供了一个方法把一个名称与元组中的一个元素对应起来。 记录的定义: -record(Name,{                 key1 = Default1,                 key2 = Default2,                 key3,        %

铿锵玫瑰的专栏 4607

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

erlang xml 解析_Erlang中的Record详解

在Erlang内部只有两种混合的数据类型:List和Tuple,而这两种都不支持命名访问,所以如果没有额外的库的话想创建像PHP、Ruby或Python中的关联数组(Ruby中的Hash)是不可能的在Ruby中我可以这样做:代码如下:server_opts = {:port => 8080, :ip => '127.0.0.1', :max_connections => 10}在...

weixin_42355294的博客 327

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

erlang record使用

erlang record使用 本文主要介绍erlang中record的使用。record类似于c里面的结构体。 本文主要参考:http://learnyousomeerlang.com/a-short-visit-to-common-data-structures#wont-be-too-long 好,下面上货。 -module(recorddemo). %

archer的技术故事 1759

Erlang里的Record

原文:Erlang: An Introduction to Records在Erlang内部只有两种混合的数据类型:List和Tuple,而这两种都不支持命名访问,所以如果没有额外的库的话想创建像PHP、Ruby或Python中的关联数组(Ruby中的Hash)是不可能的在Ruby中我可以这样做:Java代码server_opts={:port=>8080,:ip=&g...

weixin_30810583的博客 91

Erlang:关于Record record_info

《Mnesia用户手册》中有几句话: 表达式 record_info(fields,record_name)被 Erlang 宏预处理程序处理后返回记录的域名列表.定义记录-record(foo, {x,y,z}), 表达式 record_info(fields,foo)被扩展为列表[x,y,z]. 所以,record_info/2这个是在编译时预处理的,不是运行时执行,所以如

sdsabc2000的专栏 2887

Erlang中的record

shixinfeng_st的博客 431

Erlang:关于Record

<br />《Mnesia用户手册》中有几句话:<br />表达式 record_info(fields,record_name)被 Erlang 宏预处理程序处理后返回记录的域名列表.定义记录-record(foo, {x,y,z}), 表达式 record_info(fields,foo)被扩展为列表[x,y,z].<br />所以,record_info/2这个是在编译时预处理的,不是运行时执行,所以如下代码会报错的,而且是在编译的时候就已经报错:<br />A=foo,<br />record_in

zhangxinrun的专栏 2638

erlang中的代码热替换实践——动态升级尾递归中的用来记录状态的Record

最近在项目开发中,遇到了一个问题,就是如何在erlang中对模块进行代码热替换的时候,同时修改进程中尾递归所传递的用于记录状态的Record信息。典型的程序结构如下:-record(stat, {ver=?VER, counter=0}). loop(#stat{ver=_Ver, counter=Counter}=Stat) ->     receive         {ver} ->

mulin.tian's footprint 1513
上一篇: Erlang与ActionScript3采用JSON格式进行Socket通讯
下一篇: Erlang里的make
hidetobj
博客等级 码龄19年 16粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值