热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Erlang学习:介绍Erlang里的Record

转自:http:hideto.iteye.comblog241246在Erlang内部只有两种混合的数据类型:List和Tuple,而这两种都不支持命名访问,所以如果没有额外的库的话想创建像P

转自:http://hideto.iteye.com/blog/241246

在Erlang内部只有两种混合的数据类型:List和Tuple,而这两种都不支持命名访问,所以如果没有额外的库的话想创建像PHP、Ruby或Python中的关联数组(Ruby中的Hash)是不可能的 
在Ruby中我可以这样做: 

Java代码  收藏代码
  1. server_opts = {:port => 8080, :ip => '127.0.0.1', :max_connections => 10}  

在Erlang的语法级别不支持这种表达 

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

定义Record  
Record更类似于C中的struct,而不是关联数组,后者必须一开始就定义好内容并且只能保持数据 
这里是一个服务器的连接选项的Record例子: 
Java代码  收藏代码
  1. -module(my_server).  
  2.   
  3. -record(server_opts,  
  4.   {port,  
  5.   ip="127.0.0.1",  
  6.   max_cOnnections=10}).  
  7.   
  8. % The rest of your code goes here.  

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

创建Record  
Record通过使用#符号来创建,下面是创建server_opts这个Record的实例的合法方式: 
Java代码  收藏代码
  1. Opts1 = #server_opts{port=80}.  

这段代码创建了一个server_opts Record,port设置为80,其他field使用默认值 
Java代码  收藏代码
  1. Opts2 = #server_opts{port=80, ip="192.168.0.1"}.  

这段代码创建了一个server_opts Record,但是ip设置为"192.168.0.1" 

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

访问Record  
Record的访问方式很笨拙,如果我想访问port这个field,我可以这样做: 
Java代码  收藏代码
  1. Opts = #server_opts{port=80, ip="192.168.0.1"},  
  2. Opts#server_opts.port  

每次你想访问一个Record时你都必须包含Record的名字,为什么要这样? 
因为Record不是真正的内部数据类型,它只是编译器的小把戏。 

在内部,Record是Tuple,如下: 
Java代码  收藏代码
  1. {server_opts, 80"127.0.0.1"10}  

编译器将Record的名字映射到Tuple里面 
Erlang虚拟机记录了Record的定义,而编译器将所有的Record逻辑翻译为Tuple逻辑 
因此,根本就没有Record类型,所以每次你访问一个Record时你必须告诉Erlang我们在用哪个Record(为了编译器爽,程序员变的很不爽) 

更新Record  
更新Record和创建Record很类似: 
Java代码  收藏代码
  1. Opts = #server_opts{port=80, ip="192.168.0.1"},  
  2. NewOpts = Opts#server_opts{port=7000}.  

这里首先创建一个server_opts Record 
NewOpts = Opts#{port=7000}创建了一个Opts的副本,并指定port为7000并绑定到NewOpts 

匹配Record和Guard语句  
不谈模式匹配就不算Erlang 
让我们来看看一个例子: 
Java代码  收藏代码
  1. handle(Opts=#server_opts{port=8000}) ->  
  2.   % do special port 8080 stuff  
  3. handle(Opts=#server_opts{} ->  
  4.   % default stuff  

Guard语句和上面的类似,例如绑定小于1024的端口通常需要root权限,所以我们可以这样做: 
Java代码  收藏代码
  1. handle(Opts) when Opts#server_opts.port <= 1024 ->  
  2.   % requires root access  
  3. handle(Opts=#server_opts{}) ->  
  4.   % Doesn't require root access  


使用Record  
在我使用Erlang的有限的时间里,我发现Record主要用在两种场景 
首先,Record用来保存状态,特别是在使用gen_server的behaviour时 
由于Erlang不能全局保持状态,所以状态必须在方法之前传来传去 
然后,Record可以用来保存配置选项,这可以认为是第一点的子集 
尽管如此,Record也有一些限制,最明显的是不能在运行时添加和删除field,这和C的struct一样,Record的结构必须预先定义 
如果你想在运行时添加和删除field,或者你在运行时才能确定有哪些field,这时你应该使用 dict 而不是Record



推荐阅读
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 只使用’if-else’语句的’else’部分是否可以接受?有时,我觉得检查所有条件是否都是真的更容易,但是只处理“其他”情况。我想 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 使用CocoaPods管理依赖库
    这篇内容将介绍Mac和iOS开发中必备的一个依赖库管理工具CocoaPods。在iOS开发中势必会用到一些第三方依赖库,比如大家都熟悉的ASIHttpRequest、AFNetwo ... [详细]
  • 数学中的常见的距离公式
    数学中的常见的距离公式转载自:点击打开链接最近看到文章中对距离的衡量依据所针对的问题,针对所使用到的各种距离公式从网上搜罗如下1.欧氏距离,最常见的两点之间或多点之间的距离表示法, ... [详细]
  • rust编程这篇文章是关于我通过解决Twitch上尚未解决的所有CtCI问题来学习Rust的经验。英国科学博物馆集团AdaLovelace的肖像Rust徽标,由Moz ... [详细]
  • Hadoop——Hive简介和环境配置
    一、Hive的简介和配置1.简介Hive是构建在Hadoop之上的数据操作平台lHive是一个SQL解析引擎,它将SQL转译成MapReduce作业,并 ... [详细]
  • “最好的语言”
    编程语言会塑造这门语言使用者的思维方式,这有助于解释科技创业公司的运行方式,以及它们能重新发明自己的原因。当日本计算机科学家松本行弘决定创造Ruby时,他正在追逐SamuelR.D ... [详细]
author-avatar
大牛
大水牛
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有