【转】Erlang基本数据类型

在讲述数据类型前先简单的介绍一下Erlang中的变量,Erlang中的变量和其他语言中的变量相比有三点不同:

1.Erlang不对变量的类型进行定义,它可以被赋值成任何类型的值,Erlang中所有类型的值统称为一个Term。这使得编译器并不能在编译时发现数值类型的不匹配,只有在运行时发现错误,好处是不像C++一样能通过强制类型转换蒙蔽系统,造成内存泄露,也使得Erlang不像C++一样易于发现代码中的问题。不过Erlang现在已经有一套类型,函数的定义机制,能通过dialyzer来查找代码中的不匹配了。

2.Erlang中的变量只能被赋值一次,第二次赋值将被编译器理解为进行比较,如果值相同将返回该值,如果不同将会抛出异常。

3.Erlang中的变量必须以大写字母或下划线打头,否则将不被编译器理解为变量,且大写字母打头和下划线打头的变量有些不同的行为。

一.Number

1.整数(integer)——整数被记作一串十进制数字,例如,12,12375和-23427都是整数。整数的算术运算是准确的,没有精度限制

2. 浮点数(float)——浮点数被表示为满足IEEE754[43]规则的64位浮点数。所有±10E308范围内的实数都可以用Erlang浮点数表示。

3.支持用$char来获取字符的ASCII值

4.支持进行2-36进制数的表示,如3#11表示4.

二.Atom

有点类似于常值。它一般都是由小写字母打头的字母组成的,如果其以大写字母打头,或者含有除字母,下划线,@之外的字符,则需要用单引号引起来表示Atom。

Atom比C++中的常量更方便易用,比如我们可以直接用circle,line来代表不同的图形类型。而不用先定义CIRCLE,LINE常量。

Atom好用但是不能滥用,因为用Atom有下面几点弊端:

1.Atom保存在atom table中,一个Atom占用4个(32bit)或8个(64bit)字节,且会持续的占用内存,不参与垃圾回收,另外其本身也有不能超过1048577个的限制。

2.Atom只能进行比较,而不能进行任何的处理操作,比如分隔,匹配等等。

Erlang中的保留字有:

after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor

三.Tuple

类似于Object,不同的是,它的长度是固定的,形式如下:

{Term1,...,TermN}

可以用模式匹配的方式轻松的获取Tuple中的某一值。

四.List

形式如下:

[Term1,...,TermN]

可以用|来连接Head和Tail,其中Head可以是任意Term,而Tail必须是List。

如[1|2]虽然能正常执行,但是却不能被length等内置函数使用。

需要注意的是:

length(1|[2,3])为3,但是

length([1,2]|3)为2

可以用模式匹配的方式依次获取List的Head。

List还支持查询式的操作,用法如下:

NewList = [Expression || GeneratorExp1, GeneratorExp2, ..., GeneratorExpN, Condition1, Condition2, ... ConditionM]

如,X取值为1或5,Y取值为6或7,我们要找到和能被3整除的X和Y.

[{X,Y}||X<-[1,5],Y<-[6,7],(X+Y) rem 3 =:=0].

输出[{5,7}]

五.Bit Strings

Bit Strings代表无类型的内存区域,表现形式为<<E1,...,En>>。

其中Ei的形式为Value 或 Value:Size 或 Value/TypeSpecifierList 或 Value:Size/TypeSpecifierList

TypeSpecifierList的形式为Type-Signedness-Endianness-unit:IntegerLiteral.

其中Type可以是integer(default),float,binary,bytes,bitstring,bits,utf8,utf16,utf32形式的

Signedness可以是signed或者unsigned(default)

Endianness可以是big(default),little,native

IntegerLiteral取值范围是1-256,这个数值用来扩展内存区域,将原来的区域扩展Size*(IntegerLiteral-1)位,默认值为1,即不进行扩展。

可以用模式匹配的方式轻松的获取内存区域中某一位置的值,用Erlang来处理数据很方便,但是不推荐使用Erlang来处理大量的数据,因为Erlang在数据处理方面比C++慢。

当Bit Strings中所有的Ei的Size都为8时,叫做Binaries。

Binaries也支持查询式的操作,实际上Binaries能查询得到List,List也能查询得到Binary。最直观的还是举例来看一下。

1.List得到List

[2*N || N <- [1,2,3,4]].
[2,4,6,8]

2.List得到Binary,注意要写明类型或size。

<<<<(N*2):8>> || N <- [1,2,3,4]>>.<<2,4,6,8>>

3.Binary得到List,注意<-变成了<=

[2*N || <<N>> <= <<1,2,3,4>>].
[2,4,6,8]

4.Binary得到Binary

<<<<(N*2):8>> || <<N>> <= <<1,2,3,4>>>>.<<2,4,6,8>>

六.Fun

函数对象,有两种方法给函数对象赋值

1.将一个匿名函数赋值给函数对象。

匿名函数的形式如下:

fun
    (Pattern11,...,Pattern1N) [when GuardSeq1] ->
        Body1;
    ...;
    (PatternK1,...,PatternKN) [when GuardSeqK] ->
        BodyKend

2.将一个已经定义的函数赋值给函数对象。形式如下:

fun Name/Arity
fun Module:Name/Arity

其中Name表示函数名,Arity表示参数的个数。

七.String

String由双引号和字符串来表示,其实质是List。如"hello"等价于[$h,$e,$l,$l,$o].

两个相邻的字符串将组合成一个字符串,即"he" "llo"等价于"hello"。

也可以用Binary来表示字符串。

八.Record

Record类似于Struct,Record表达式会在编译时转为tuple表达式。

1.定义Record:

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

2.新建Record:

#Name{Field1=Expr1,...,FieldK=ExprK}

其中某些Field可以省略,这时这些Field将获得默认值。

如果需要将多个Field赋同一值,可以用下面的方式:

#Name{Field1=Expr1,...,FieldK=ExprK, _=ExprL}

这时所有省略的Field都将被赋值成ExprL

3.访问Field:Expr#Name.Field

4.更新Field

Expr#Name{Field1=Expr1,...,FieldK=ExprK}

九.Boolean

没有该类型,但是可以用true和false代表Boolean值。true和false可以正常的用在一些进行判断的场合,如:

true and false.
false or true.
true xor false.
not false.
not (true and true).

但是不能和C++中一样,当成数字来用,要牢记,在Erlang中,它是Atom值。

十.Pid

Pid是Process Identifier(进程标识符)的缩写,Pid由Erlang的spawn(…)原语创建,Pid是Erlang进程的引用。可以通过self()得到当前进程的pid,打印格式:<0.35.0>

十一.port

端口用于与外界通信,由内置函数(BIF3)open_port来创建。消息可以通过端口进行收发,但是这些消息必须遵守所谓“端口协议”(port protocol)的规则。端口和进程差不多,只是他还可以与外界通信,端口的打印格式:#Port<0.472>

十二.reference

reference引用是全局唯一的符号,只用来比较两个引用是否相等。引用可以通过调用Erlang原语make_ref()来创造。打印格式为#Ref<0.0.0.39>。引用常被用作各种要求保证唯一性的一次性标签或cookie。

十三.类型转换

1.除了tuple_to_list转换成list时都会尽力转成字符串形式

atom_to_list(hello)."hello"binary_to_list(<<"hello">>)."hello"binary_to_list(<<104,101,108,108,111>>)."hello"float_to_list(7.0)."7.00000000000000000000e+00"integer_to_list(77)."77"tuple_to_list({a,b,c}).
[a,b,c]

2.Number转binary都转成了字符串

integer_to_binary(77).<<"77">>float_to_binary(7.0).<<"7.00000000000000000000e+00">>

3.其他的转换

list_to_atom("hello").
hello
list_to_binary("hello").<<104,101,108,108,111>>list_to_float("7.000e+00").7.0list_to_integer("77").77list_to_tuple([a,b,c]).
{a,b,c}
term_to_binary({a,b,c}).<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>binary_to_term(<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>).
{a,b,c}
binary_to_integer(<<"77">>).77binary_to_float(<<"7.000e+00>>").7.0

十四.类型判断

is_atom/1           
is_binary/1        
is_bitstring/1      
is_boolean/1        
is_builtin/3       
is_float/1          
is_function/1       
is_function/2      
is_integer/1        
is_list/1           
is_number/1        
is_pid/1            
is_port/1           
is_record/2         
is_record/3         
is_reference/1      
is_tuple/1
时间: 2024-08-04 15:49:00

【转】Erlang基本数据类型的相关文章

erlang自定义数据类型

Erlang系统自带的基础数据类型有:atom.tuple.list.binary.pid.float.number.port.reference.record. 用户可以通过通过命令type来自定义数据类型,实现方法: -type device() :: atom() | pid(). -type prompt() :: atom() | string(). 定义完后,可以在模块中使用export_type,将用户自定义类型导出,以便其他模块重用. -type env() :: [{atom(

Erlang基础 - 数据类型

Erlang数据类型很少,很容易掌握: 一.数值类型(整数和浮点数)       1.整数 整数大小事没有限制的,较小的整数会被存放在单个机器字长内,较大的整数会自动按需分配内存.所以根本就不存在溢出的问题. 示例: 101 -101 1234567890 * 987654321 * 999999999 另外,还可以使用2进制到36进制的整数,如:16#FF00,2#10101,36#ZZ. 还有,利用$前缀记法可以得到任意字符的数值编码(ascii/Latin-1/Unicode皆可) 如:$

Erlang语言研究综述

摘 要: 本文前半部分主要是关于Erlang编程语言相关的内容:着重就一般学习编程语言的一般的关注点来阐述了Erlang编程语言的基本语法点,主要包括:Erlang的变量.Erlang的数据类型.Erlang的语句和Erlang编程语言的函数与模块四个方面:本文的后半部分主要就Erlang语言的并行化编程的实践:Erlang的并行化编程与Erlang并行化编程在矩阵乘积的实际应用,通过实践,可以发现,Erlang语言确实在并行化编程方面表现得很优秀. 关键词:并行计算:Erlang:编程语言:矩

Erlang 摘要

世界是并行的,Erlang程序反应了我们思考和交流的方式,人作为个体通过发送消息进行交流,如果有人死亡,其他人会注意到.Erlang里的模块类相当于OOPL中的类,进程相当于OOPL里的对象或类实例.并发编程可以用来提升性能,创建可扩展和容错的系统,以及编写清晰和可理解的程序来控制现实世界里的应用. 并发程序是以一种并发编程语言编写的程序,并发编程语言拥有用于编写并发程序的语言结构.Erlang的并发程序是由互相通信的多组顺序进程组成,一个进程就是一个轻量级的虚拟机,可以执行单个的Erlang函

Erlang中的模块与模式匹配

模块是Erlang的基本代码单元,erl文件编译后以.beam作为扩展名,采用UTF8字符集,.erl文件示意如下: -module(模块名,与存放模块的文件名相同) -export([方法名/输入参数的个数]) Method1( {a,b,c})->a*b*c; Mehtod2({d,e})->d-e. 模块属性有两种类型:预定义型和用户定义型. Erlang中用于代表函数的数据类型被称为fun,相当于python中的lambda,一般用于 1)      对列表里的每个元素执行相同的操作

j教你如何用erlang-tuple

元组是用来保存一组数据元素的复合数据类型,其中数据元素是要求为erlang的数据类型,单不一定要是相同的类型,元组使用封闭的花括号{}来定义,里面的元素有逗号隔开. 例如: 1> {1,2,3}. 2> {1,{2,3},4}. 3> {1,[2,3],4}. 4> {1,"23",4}. tuple 的bifs函数: erlang:tuple_size(Tuple) ->Length. Tuple 的长度 erlang:element(i,Tuple)

[Erlang之旅 0001] 基本数据类型

数据的基本类型:数值.原子.元组.列表 1 .在Erlang的世界内,一但变量赋值之后,变量不会改变,如果再赋予其它值,就会报错,这和其它大多数语言不同.变量命名通常以大写字母开头,如果有多个单词,则每个单词的首字母大写,如:LastName='YY' 2 . 数值:包含整数和浮点 大部分的算术运算都会自动进行类型转换. 3. 原子 原子是一种仅由字符序列来标识的特殊字符串常量.两个原子只要具有相同的字符表示,就完全相同. 原子的命名: 原子通常以小写字母开头,首字母后可以用大写字母.数字.下划

对Erlang开发者的几点建议

* 确保没有任何编译警告 * Erlang中String采用list实现,32位系统中,其1个字符用8个字节的空间(4个保存value, 4个保存指针).因此string速度较慢,空间占用较大 * 在Server中,总是尽力书写尾递归(tail-recursive)的函数 * 使用'++'时,left list会被拷贝,然后添加到right list的头部,因此最好把length较短的list放在左侧 * 避免使用regexp,如果需要正则表达式,请使用re * timer模块的大部分函数实现,

一位Erlang程序猿的自白

12.00 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority