`
guibin
  • 浏览: 363863 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang 学习笔记(二)

阅读更多
Erlang 学习笔记(二) 
guibin.beijing@gmail.com

1.5 Erlang的数据类型
变量(variables):
Erlang 学习笔记(一)中的代码中的double函数定义发现,其参数为X,而且是大写的,这就是Erlang对变量定义的要求。
Erlang中变量必须以大写字母开头,比如Number,ShoeSize,Age等。如果不是以大写字母开头,编译时会报错。

Atoms:
Erlang中另外一种数据类型叫Atoms。Atoms以小写字母开头,仅仅表示名字而已,没有其他意义,变量可以存储数据,而Atoms则不能存值数据。比如tut2中
引用
-module(tut2).
-export([convert/2]).

convert(M, inch) ->
    M / 2.54;

convert(N, centimeter) ->
    N * 2.54.

convert函数将英寸和厘米相互转换。在这个convert函数定义中使用的"inch"和"centimeter"就是Atoms,M和N是变量。Atoms在这里相当于用来区分两个函数的用途,起到标记的作用。
在convert inch的定义结束时,使用了";"而不是".",这表示分号之后还有属于该函数的代码。
编译和运行结果如下:
引用
5> c(tut2).
{ok,tut2}
6> tut2:convert(20, inch).
7.874015748031496
7> tut2:convert(20, centimeter).
50.8


元组(Tuples):
Erlang使用Tuple将一组相关的数据放在一起,使得更易于理解。Tuple用大括号“{}”将元素包围起来。回忆一下,Scala中也有Tuple,其意义和Erlang的一样,区别是使用小括号“()”。
比如tut3:
引用
-module(tut3).
-export([convert_length/1]).

convert_length({centimeter, X}) ->
    {inch, X / 2.54};
convert_length({inch, Y}) ->
    {centimeter, Y * 2.54}.

编译和运行结果如下:
引用
10> tut2:convert(20, inch).       
7.874015748031496
11> tut2:convert(20, centimeter). 
50.8
12> tut3:convert_length({inch, 20}).
{centimeter,50.8}
13> tut3:convert_length({centimeter, 20}).
{inch,7.874015748031496}
14> tut3:convert_length(tut3:convert_length({centimeter, 20})).
{centimeter,20.0}

注意上面14行是如何工作的,首先将20厘米转换成英寸,然后在转换回厘米,结果还是原来的20厘米。函数的返回值作为外层函数的输入参数。
截止目前为止,我们看到的元组都只有两部分,实际上元组可以有任一多部分组成。比如:
引用
{moscow, {c, -10}}
{cape_town, {f, 70}}
{paris, {f, 28}}


列表(Lists):
列表就是用“[]”将多个元素括起来,元素之间用逗号“,”隔开。比如:
引用
[{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}}, {paris, {f, 28}},
{london, {f, 36}}]

List一般如果比较长,一行写不下的话,则Erlang允许将代码在任何“合理”的地方断开,比如,只要不在atoms,integers等中间断开就可以。
另外可以使用"|"来查找List中特定位置上的元素,请看如下的例子:
引用
20> [First | Rest] = [1, 2, 3, 4].
[1,2,3,4]
21> First.
1
22> Rest.
[2,3,4]

这和Scala中的模式匹配非常类似。First匹配上了第一个元素,剩余的全部元素匹配给Rest。
引用
23> [First2, Second2 | Rest2] = [1, 2, 3, 4, 5, 6, 7, 8].
[1,2,3,4,5,6,7,8]
24> First2.
1
25> Second2.
2
26> Rest2.
[3,4,5,6,7,8]
27>

使用"|"获取List中前两个元素,剩余的赋给"|"后面的元素。如果List长度比要匹配的少一个,则返回空List。比如:
引用
4> [One, Two, Three | Last] = [1, 2, 3].
[1,2,3]
5> Last.
[]
6> Three.
3

如果List的长度比要匹配的少多个,则会抛异常:
引用
5> [One, Two, Three | Last] = [1, 2].  
** exception error: no match of right hand side value [1,2]


看一个使用List的综合例子。该例子list_length获取List的长度:
引用
-module(tut4).
-export([list_length/1]).

list_length([]) ->
    0;
list_length([First | Rest]) ->
    1 + list_length(Rest).


编译和运行:
引用
10> c(tut4).
./tut4.erl:6: Warning: variable 'First' is unused
{ok,tut4}
11> tut4:list_length([]).
0
12> tut4:list_length([1, 2, 3, 4]).
4
13> tut4:list_length(["Hello", "Hi"]).
2

看到编译时提示的警告,说First定义了但是没有使用,跟Scala一样,我们可以用占位符“_”代替First,然后再次编译运行就没问题了。代码如下:
引用
-module(tut4).
-export([list_length/1]).

list_length([]) ->
    0;
list_length([_ | Rest]) ->
    1 + list_length(Rest).


字符串(String):
Erlang没有String数据类型,而字符串可以给ASCII码代替。因此[97, 98, 99]和“abc”相等。比如:
引用
23> [97, 98, 99].
"abc"



Guibin
1
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics