原子类型
原子
原子类型是 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 表示华氏度