- 浏览: 505422 次
- 性别:
- 来自: 广州
最新评论
-
cppmule:
Play!在国内实际产品级应用案例有吗?有哪些公司在用?国外的 ...
play总结性介绍 -
你好javaword:
netty的个人使用心得 -
hyfwuhui:
java 并发环境下使用ConcurrentHashMap -
asialee:
朋在无锡 写道可以将Channels使用静态导入的方式:imp ...
netty的个人使用心得 -
朋在无锡:
可以将Channels使用静态导入的方式:import sta ...
netty的个人使用心得
Erlang学习记录(二)——基本数据类型
2013-07-27 20:16 865人阅读 评论(6) 收藏 举报
目录(?)[+]
Erlang可以说和我以前接触过的语言都大不相同,这个从它的类型定义就可以看出来。。。反正学起来觉得既不熟悉,也不亲切,我估计在用Erlang写应用的时候,整个编程思路都要变一下了。不过存在即是合理的,鉴于Erlang在面向并发,轻量进程,方便的数据处理还有容错性上的巨大优势,还是咬咬牙学吧!
在讲述数据类型前先简单的介绍一下Erlang中的变量,Erlang中的变量和其他语言中的变量相比有三点不同:
1.Erlang不对变量的类型进行定义,它可以被赋值成任何类型的值,Erlang中所有类型的值统称为一个Term。这使得编译器并不能在编译时发现数值类型的不匹配,只有在运行时发现错误,好处是不像C++一样能通过强制类型转换蒙蔽系统,造成内存泄露,也使得Erlang不像C++一样易于发现代码中的问题。不过Erlang现在已经有一套类型,函数的定义机制,能通过dialyzer来查找代码中的不匹配了。
2.Erlang中的变量只能被赋值一次,第二次赋值将被编译器理解为进行比较,如果值相同将返回该值,如果不同将会抛出异常。
3.Erlang中的变量必须以大写字母或下划线打头,否则将不被编译器理解为变量,且大写字母打头和下划线打头的变量有些不同的行为。
一.Number
1.支持数字和浮点型。
2.浮点可表示为2.3,2.3e3,2.3e-3等类型。
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] ->
BodyK
end
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值。
十.类型转换
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.0
list_to_integer("77").
77
list_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">>).
77
binary_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
十二. 后记
除了上述类型之外,还有一些特别的类型,如reference(),pid(),port()等将在以后介绍。
参见:http://www.erlang.org/doc/reference_manual/data_types.html
2013-07-27 20:16 865人阅读 评论(6) 收藏 举报
目录(?)[+]
Erlang可以说和我以前接触过的语言都大不相同,这个从它的类型定义就可以看出来。。。反正学起来觉得既不熟悉,也不亲切,我估计在用Erlang写应用的时候,整个编程思路都要变一下了。不过存在即是合理的,鉴于Erlang在面向并发,轻量进程,方便的数据处理还有容错性上的巨大优势,还是咬咬牙学吧!
在讲述数据类型前先简单的介绍一下Erlang中的变量,Erlang中的变量和其他语言中的变量相比有三点不同:
1.Erlang不对变量的类型进行定义,它可以被赋值成任何类型的值,Erlang中所有类型的值统称为一个Term。这使得编译器并不能在编译时发现数值类型的不匹配,只有在运行时发现错误,好处是不像C++一样能通过强制类型转换蒙蔽系统,造成内存泄露,也使得Erlang不像C++一样易于发现代码中的问题。不过Erlang现在已经有一套类型,函数的定义机制,能通过dialyzer来查找代码中的不匹配了。
2.Erlang中的变量只能被赋值一次,第二次赋值将被编译器理解为进行比较,如果值相同将返回该值,如果不同将会抛出异常。
3.Erlang中的变量必须以大写字母或下划线打头,否则将不被编译器理解为变量,且大写字母打头和下划线打头的变量有些不同的行为。
一.Number
1.支持数字和浮点型。
2.浮点可表示为2.3,2.3e3,2.3e-3等类型。
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] ->
BodyK
end
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值。
十.类型转换
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.0
list_to_integer("77").
77
list_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">>).
77
binary_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
十二. 后记
除了上述类型之外,还有一些特别的类型,如reference(),pid(),port()等将在以后介绍。
参见:http://www.erlang.org/doc/reference_manual/data_types.html
发表评论
-
netty4更新详解
2015-11-14 10:52 644netty现在应该是java界最流行的网络框架之一了,高性能, ... -
Lua使用protocolbuf
2015-11-10 16:04 871在https://code.google.com/p/prot ... -
领域模型设计
2015-09-12 17:29 696一:面向对象设计中最简单的部分与最难的部分 如果说事务脚本是 ... -
关于分表与分库思路
2015-07-06 15:36 630首先主要实现应该参考开源产品,目前比较能上台面的是 tddl, ... -
NAT穿透解决方案介绍
2015-04-01 03:12 2010最近公司要实现在各种网络环境下面的多屏互动(机顶盒、andro ... -
音视频即时通讯开发中使用P2P技术的好处
2015-04-01 02:59 745在服务器的配置文件“A ... -
nat穿透原理
2015-04-01 02:01 1055一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技 ... -
集群、分布式、负载均衡区别与联系
2015-03-25 22:54 5941、Linux集群主要分成三 ... -
: 结构化数据的共享存储
2015-03-24 04:25 0开发笔记 (6) : 结构化数据的共享存储 开始这个话题前, ... -
:如何构建超强伸缩性的游戏服务器而集容错、负载均衡和无限伸缩性于一身
2015-03-24 04:04 921附标题:如何构建超强 ... -
edis在游戏服务器中的应用
2015-03-24 02:57 625edis在游戏服务器中的应 ... -
社交游戏之双机热备方案 预防单点故障
2015-03-23 04:46 883某一天深夜,单盘配置的服务器出现硬盘损坏,导致该服务器上所提 ... -
游戏服务器集群设计思路
2015-03-23 04:45 798对于我们的游戏服务器端来说,除了要满足一般的MMO服务 ... -
Erlang类型及函数声明规格
2015-03-04 14:33 665Erlang类型及函数声明规格 Author: Mail: ... -
(转)erlang lists模块函数使用大全
2015-02-12 16:26 629一,带函数Pred 1, all(Pred ... -
超越并行框架erlang之流的通讯框架
2015-02-05 17:41 660http://blog.codingnow.com/2011/ ... -
如何使用 Oracle Linux 中的硬件故障管理
2014-11-10 14:38 1477如何使用 Oracle Linux 中 ... -
配置nginx
2014-06-14 18:04 621http://www.cnblogs.com/wenanry/ ... -
centos 安装mysql
2014-06-13 12:23 601你是root權限嗎?_操作系統的_ 兩種方法 1 使用替換法 ... -
一个定期备份MySQL数据库的Shell脚本
2014-06-11 10:01 911一个定期备份MySQL数据库的Shell脚本 S ...
相关推荐
程序、服务器和消息处理部分指出,Erlang中的进程可以接收不同类型的消息。消息分为普通消息和退出信号(exitsignals),处理消息时,程序可以挂起接收进程,或者通过链接(link)和监视监视(monitor)机制来处理进程间的...
【描述】虽然描述中没有具体的信息,但我们可以假设这是一个博主分享的关于Erlang学习的初步笔记,可能涵盖了基本语法、并发模型以及一些实用工具的使用。 【标签】"源码"和"工具"提示我们,这篇笔记可能包括了...
Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.
这在处理列表、元组和其他复合数据类型时非常有用。 6. **热代码升级**:Erlang允许在运行时替换和更新代码,而无需停止整个系统,这是其在高可用性场景下的一大优势。理解如何编写可热升级的代码和使用工具进行...
这两本电子书——《Erlang and OTP in Action》和《Erlang程序设计》——都是深入学习Erlang语言和OTP的宝贵资源。 《Erlang and OTP in Action》这本书主要分为三个部分。第一部分介绍Erlang语言的基础知识,包括...
- **第3章:基本语法** —— 介绍Erlang的基本语法,包括变量、数据类型、流程控制等。 - **第4章:函数式编程** —— 讲解函数式编程的基本原理及其在Erlang中的应用。 - **第5章:进程与并发** —— 详细介绍...
用于erlang学习资源 一些基本的语言
Erlang学习资料,2本书,不用卖书,电子书足够了
### Erlang学习笔记:深入解析Erlang编程与系统管理 #### 1. Erlang编程基础与资源 在深入探讨Erlang编程之前,我们首先需要了解一些基础资源和学习资料。Erlang官方网站([www.erlang.org](http://www.erlang.org...
1. **Erlang语法**:涵盖基本的变量、数据类型(如原子、列表、元组和二进制)、控制结构(如case表达式和if语句)以及函数定义。 2. **函数式编程概念**:Erlang是纯函数式语言,书中可能会介绍函数式编程的基本...
### Erlang Binary与Bit String 数据类型详解 #### 引言 Erlang 是一种功能强大且灵活的编程语言,尤其适合开发高并发、分布式及容错性应用。自 R12B 版本以来,Erlang 在处理二进制数据方面引入了两项重大更新:...
### Erlang 入门学习经典资料解析 #### Erlang 的神秘与起源 Erlang,作为一门相对小众但极具特色的编程语言,自问世以来便伴随着一种神秘的气息。这种神秘感不仅源于它独特的编程范式——函数式编程,还在于其...
资源名称:Erlang语音学习资料汇总资源目录:【】Erlang程序设计【】[ManningPublications]ErlangandOTPinAction【】[NoStarchPress]LearnYouSomeErlangforGreatGood!ABeginner'sGuide【】[O'ReillyMedia]...
- **Erlang基础**:包括基本语法、数据类型、函数定义、模式匹配、过程和模块等。 - **并发编程**:介绍Erlang的进程、消息传递、同步和通信机制,以及如何利用这些特性实现并发。 - **分布式Erlang**:讲解如何在...
Mnesia提供了记录模式,用户可以自定义数据结构,并且支持多种查询语言,包括简单的键值查询和复杂的记录查询。 4. MySQL MySQL是一种广泛应用的关系型数据库管理系统,与Erlang可以通过第三方库如mysql.erl进行...
erlang rebar 二进制
学习erlang的时候尝试编写的小例子,使用post方式发送json数据来进行http请求,希望能帮到大家~
在文档“erlang学习2.pdf”中,作者通过一系列示例和代码介绍了Erlang语言的基本概念及其在网络编程中的应用。本篇将围绕文档中的核心知识点进行深入解读,主要包括:构建一个简单的HelloServer、Table的并发消息...
在这个“erlang 连接学习例子”中,我们有两个核心文件:`server.erl` 和 `client.erl`,它们分别代表了一个服务器进程和客户端进程,展示了Erlang中进程间的通信机制。 `server.erl` 文件通常包含一个持续运行的...