说说erlang tuple和record结构

erlang有两种复合结构,tuple和list,两者的区别是tuple子元素的个数是固定不变的,声明后就不能改变了;而list是可变的,可以通过[H|T]来取出或插入新元素。record有点像C/C++里面的结构体,实际上是语法糖,方便我们的开发,代码汇编时转成tuple表达形式。

Tuple

tuple的表示方法如:

{Term1,...,TermN}

下面以例子说明erlang tuple及一些基本操作:

1> A = {1,2}.
{1,2}
2> tuple_size(A).
2
3> is_tuple(A).
true
4> tuple_to_list(A).
[1,2]
5> element(1, A).
1
6> setelement(2, A, 3).
{1,3}

Record

record有点像C/C++里面的结构体,表示方法如:

-record(Name, {Field1 [= Value1],
               ...
               FieldN [= ValueN]}).

下面以例子说明erlang record及一些基本操作:

%% shell下定义 record结构 person
%% 等效程序里定义 -record(person, {name, age}).
7> rd(person, {name, age}).
person
8> A1 = #person{name = "john", age = 10}.
#person{name = "john",age = 10}
9> A2 = A1#person{name = "Lucy"}.
#person{name = "Lucy",age = 10}

%% record 一次赋值
10> X = #person{_ = 1}.
#person{name = 1,age = 1}
11> element(2, X).
1
12> setelement(2, X, "Tom").
#person{name = "Tom",age = 1}

tuple 和 record 有什么关系?

record只是语言程序上的结构,方便我们的开发,在erlang编译的时候会转成tuple处理

%% shell下定义 record结构 person2
%% 等效程序里定义 -record(person2, {name = "", age = 1}).
13> rd(person2, {name = "", age = 1}).
person2
14> A3 = #person2{name = "Jimmy"}.
#person2{name = "Jimmy",age = 1}

%% 模式匹配
15> {_, Name, _} = A3.
#person2{name = "Jimmy",age = 0}
16> Name.
"Jimmy"
17> #person2{name = Name2} = A3.
#person2{name = "Jimmy",age = 0}
18> Name2.
"Jimmy"

下面,以一个简单的例子,测试tuple和record的汇编代码

-module(test).

-export([test/0]).

-record(person, {name, age}).

test() ->
	A = {person, "Tom", 1},
	B = #person{name = "Tom", age = 1},
	{A,B}.

通过命令erlc -S test.erl 可以生成 test.S的汇编代码

{function, test, 0, 2}.

{label,1}.

{line,[{location,"c:/test.erl",7}]}.

{func_info,{atom,test},{atom,test},0}.

{label,2}.

{move, {literal, { {person,"Tom",1} ,{person,"Tom",1}} }, {x,0} }.

return.

参考:

http://blog.csdn.net/mycwq/article/details/31421341

说说erlang tuple和record结构

时间: 2024-10-10 09:39:40

说说erlang tuple和record结构的相关文章

Erlang中的record与宏

http://www.cnblogs.com/me-sa/archive/2011/07/20/erlang0006.html 在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据项顺序调整或者增减字段,都容易出现badmatch. 同时一些常量如果硬编码到代码中,一旦数值变化,要想全部可靠的替换成新的数值是一个困难的事情. 这两种数据层面的变化,在Erlang中对应的解决方案是: record  Macro record   在代码中我们创建一个record:   -rec

Erlang里的Record

在Erlang内部只有两种混合的数据类型:List和Tuple,而这两种都不支持命名访问,所以如果没有额外的库的话想创建像PHP.Ruby或Python中的关联数组(Ruby中的Hash)是不可能的 在Ruby中我可以这样做: server_opts = {:port => 8080, :ip => '127.0.0.1', :max_connections => 10} 在Erlang的语法级别不支持这种表达 为了避免这种限制,Erlang虚拟机提供了一个伪数据类型,称为Record 

Erlang ETS Table

不需要显示用锁,插入和查询时间不仅快而且控制为常量,这就是Erlang的ETS Table. 为什么而设计? Erlang中可以用List表达集合数据,但是如果数据量特别大的话在List中访问元素就会变慢了;这种主要是由于List的绝大部分操作都是基于遍历完成的. Erlang的设计目标是软实时(参考:http://en.wikipedia.org/wiki/Real-time_computing),在大量数据中检索的时间不仅要快而且要求是常量.为了解决快速查 询的问题,Erlang提供的机制就

Erlang--etc结构解析

Erlang中可以用List表达集合数据,但是如果数据量特别大的话在List中访问元素就会变慢了;这种主要是由于List的绝大部分操作都是基于遍历完成的. Erlang的设计目标是软实时(参考:http://en.wikipedia.org/wiki/Real-time_computing),在大量数据中检索的时间不仅要快而且要求是常量.为了解决快速查 询的问题,Erlang提供的机制就是ETS(Erlang Term Storage)和DETS(Disk Erlang Term Storage

当我们谈论Erlang Maps时,我们谈论什么 Part 2

声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.兴许Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1 继续昨天的话题,在Erlang Factory SF Bay Area 2013有一个议题:"Where are we on the Map?" [PDF ],这个Talk基本上就是选取了EEP43的要点,有兴趣的同学能够FQ观看视频 W

当我们谈论Erlang Maps时,我们谈论什么 Part 1

Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风浪.这篇文章用了比较夸张的说法:"Records are dead - long live maps !",紧接着在国内国外社区这句话就传遍了.马上就有开发者忧心忡忡的在Stackoverflow上提问:Will Erlang R17 still have records? 套用一句文艺的话,当我们

Tuple

Tuple(组元)是C# 4.0引入的一个新特性,编写的时候需要基于.NET Framework 4.0或者更高版本. 在以前编程中,当需要返回多个值得方法中,常常需要将这些值放置到一个结构体或者对象中进行返回,当然也有以out/ref参数进行传递的.但是总的来说并不能真正的符合编程的需要.从而引入Tuple. Tuple的简单使用: private Tuple<bool, object, string> GetObject() { bool result=false; object obj=

mnesia怎样改动表结构

mnesia创建的时候须要指定表record结构,假设定义的record结构改动了,就要更新数据的表结构.否则mnesia无法正常读取和写入数据. 我们最開始是这样定义结构的 -record(person, {name, age}). 然后这样建表 mnesia:create_table(person, [{disc_only_copies, nodes()}, {attributes, record_info(fields,person)}]). 有一天我们改变了这个person结构 -rec

Windows GPT磁盘GUID结构详解

前一篇Windows磁盘MBR结构详解中我们介绍了Basic Disk中的Master Boot Record结构.GPT Disk作为Windows 2003以后引入的分区结构.使用了GUID分区表结构,它与MBR相比好处是支持更大和更多的分区,提高容错.本文介绍了GUID分区表的结构和各个字段的含义. GPT Disk 的Protective MBR: GPT Disk的结构中,第一个LBA位置(LBA 0)存放的是Protective MBR,随后LBA1的位置才是GPT的GUID分区表头