Erlang数据类型

2017-04-30  本文已影响0人  Darcy_cc4c

Erlang提供的数据类型,包括以下几种:

基本类型

1> $a.  %% ASCII表中的a是97
97
2> $哈.
21704
3> $\n.
10
4> 2#100.  %% 用100表示的二进制是4
4
5> 4#100.
16
6> 16#100.
256

test
'Myhome'
'_hero'

1> <<257,1,2,3,5>>.   %%二进制型的元素如果大于8位的会自动截断,257截断成1
<<1,1,2,3,5>>
2> <<0:7,1:2>>.   %%二进制型位数如果不是8的整数倍就会产生位串,这边多了1位1
<<0,1:1>>
3> <<0:3,0:4,1:2>>.
<<0,1:1>>

1> Fun = fun(X) -> X * X end.

Fun<erl_eval.6.50752066>

2> Fun(9).
81

1> Process1 = spawn(fun() -> receive X -> io:format("recv ~p, bye~n", [X]) end end).
<0.34.0>  %% 创建一个进程等待接收消息
2> Process1 ! my_test.  %% 给进程发消息
recv my_test, bye
my_test

复合类型

为了方便定义以下的这些复合类型,我把上述的所有基本类型都称为Term。

{Term1, Term2, ..., TermN}

可以通过模式匹配或者element/2函数来提取元组里面元素的值,通过setelement/3来设置元组里面元素的值,size可以取元组里面元素的个数。

1> P = {adam,24,{july,29}}.
{adam,24,{july,29}}
2> element(1,P).
adam
3> element(3,P).
{july,29}
4> P2 = setelement(2,P,25).
{adam,25,{july,29}}
5> size(P).
3
6> {adam, Old, {Month, Day}} = P.
{adam,24,{july,29}}
7> Old.
24

{Key1=>Value1, Key2=>Value2, ..., KeyN=>ValueN}

其中Key、Value都是Term

可以通过maps模块提供的一些函数对映射组进行操作

1> M1 = #{name=>adam,age=>24,date=>{july,29}}.

{age => 24,date => {july,29},name => adam}

2> maps:get(name,M1).
adam
3> maps:get(date,M1).
{july,29}
4> M2 = maps:update(age,25,M1).

{age => 25,date => {july,29},name => adam}

5> map_size(M).
3
6> map_size(#{}).
0

[Term1, Term2, ..., TermN]

在Erlang里面,列表由一个头和一个尾组成,空列表也是一个列表。所以列表也可以有一个递归的定义

List = [Term| List] | []
[] 是一个列表, 因此
[c|[]] 是一个列表, 因此
[b|[c|[]]] 是一个列表, 因此
[a|[b|[c|[]]]] 是一个列表, 或者简写为 [a,b,c]

lists模块可以提供大量函数对列表进行操作:

1> L = [3,3,4,2,1,2,34].
[3,3,4,2,1,2,34]
2> length(L).
7
3> lists:sort(L).
[1,2,2,3,3,4,34]
4> lists:reverse(L).
[34,2,1,2,4,3,3]

其他类型(不算数据类型)

1> "hello" " " "world".
"hello world"

-module(person).
-export([new/2]).
-record(person, {name, age}).
new(Name, Age) ->
    #person{name=Name, age=Age}.

1> person:new(ernie, 44).
{person,ernie,44}

1> 2 =< 3.
true
2> true or false.
true

类型转换

Erlang提供了一些内置的类型转换函数,可以方便地进行类型转换,下面是一些类型转换的例子:

1> atom_to_list(hello).
"hello"

2> list_to_atom("hello").
hello
3> binary_to_list(<<"hello">>).
"hello"
4> binary_to_list(<<104,101,108,108,111>>).
"hello"
5> list_to_binary("hello").
<<104,101,108,108,111>>
6> float_to_list(7.0).
"7.00000000000000000000e+00"
7> list_to_float("7.000e+00").
7.0
8> integer_to_list(77).
"77"
9> list_to_integer("77").
77
10> tuple_to_list({a,b,c}).
[a,b,c]
11> list_to_tuple([a,b,c]).
{a,b,c}
12> term_to_binary({a,b,c}).
<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>
13> binary_to_term(<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>).
{a,b,c}
14> binary_to_integer(<<"77">>).
77
15> integer_to_binary(77).
<<"77">>
16> float_to_binary(7.0).
<<"7.00000000000000000000e+00">>
17> binary_to_float(<<"7.000e+00>>").
7.0

最后更新时间:2017-04-30 19:11:25
转载请注明出处,Darcy's Blog https://lintingbin2009.github.io/2017/04/30/Erlang数据类型/

上一篇下一篇

猜你喜欢

热点阅读