UP | HOME

原子类型

Table of Contents

原子

原子类型是 Erlang 语言中另一种数据类型。所有原子类型都以 小写字母 开头。原子类型就是名字而已,没有其它含义。它们与变量不同,变量拥有值,而原子类型没有

例如,charles,centimeter,inch 等

下面程序完成英寸与厘米之间的相互转换:

-module(atom).
-export([convert/2]).

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

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

测试:

2> atom:convert(10,inch).
atom:convert(10,inch).
3.937007874015748
3> atom:convert(10,centimeter).
atom:convert(10,centimeter).
25.4
到目前为止都没有介绍小数(符点数)的相关内容

如果输入的参数既不是 centimeter 也不是 inch 时会发生什么情况:

4> atom:convert(10,mile).
atom:convert(10,mile).
** exception error: no function clause matching 
                    atom:convert(10,mile) (atom.erl, line 4)

convert 函数的两部分被称之为函数的两个子句

正如所看到的那样,miles 并不是子句的一部分。Erlang 系统找不到匹配的子句,所以返回了错误消息 function_clause

shell 负责被错误信息友好地输出,同时错误元组会被存储到 shell 的历史列表中,可以使用 v/1 命令将该列表输出:

5> v(4). 
v(4). 
{'EXIT',{function_clause,[{atom,convert,
                                [10,mile],
                                [{file,"atom.erl"},{line,4}]},
                          {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,684}]},
                          {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
                          {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
                          {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]}}

元组

前面程序的风格不是一好的编程风格。例如:

atom:convert(3,inch)  
这是意味着 3 本身已经是英寸表示了呢?还是指将 3 厘米转换成英寸呢? 

Erlang 提供了将 某些元素分成组 并用以更易于理解的方式表示的机制。它就是 元组 。一个元组由 花括号 括起来的:

{inch,3} 指的就是 3 英寸,而 {centimeter, 5} 指的就是 5 厘米

接下来,重写厘米与英寸之间的转换程序:

-module(atom).
-export([convert_length/1]).

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

编译并测试:

9> atom:convert_length({inch, 5}). 
atom:convert_length({inch, 5}). 
{centimeter,12.7}

10> atom:convert_length(atom:convert_length({inch, 5})). 
atom:convert_length(atom:convert_length({inch, 5})). 
{inch,5.0}
请注意:第二个测试代码将 5 英寸转换成厘米后,再转换为就英寸,所以它得到原来的值。这也表明,一个函数实参可以是另一个函数的返回结果

元组中可以有更多的元素,而不仅仅像上面描述的那样只有两部分。事实上,可以在元组中,使用任意多的部分,只要每个部分都是合法的 Erlang 的项。例如,表示世界上不同城市的温度值:

{moscow, {c, -10}}

{cape_town, {f, 70}}

{paris, {f, 28}}

这些元组中每个都有固定数目的项。元组中的 每个项 都被称之为一个 元素

在元组 {moscow,{c,-10}} 中,第一个元素为 moscow 而第二个元素为 {c,-10}。其中,c 表示摄氏度,f 表示华氏度

Next:列表

Previous:模块和函数

Home:顺序编程