Erlang入门教程 - 4.Tuples

racaljkracaljk

现在tut2的代码是很糟糕的编程风格,考虑:

tut2:convert(3, inch).

3是英寸吗?还是将要被转换为英寸的厘米?Erlang有一个方法可以将东西分组使之更容易理解。它们就是用花括号“{”和“}”围起来的tuple

所以{inch,3}意思是3英寸,{centimeter,5}意思是5厘米。现在让我们重新写一个英寸厘米互转的程序。
在tut3.erl中输入下面的代码:

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

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

编译并测试:

14> c(tut3).
{ok,tut3}
15> tut3:convert_length({inch, 5}).
{centimeter,12.7}
16> tut3:convert_length(tut3:convert_length({inch, 5})).
{inch,5.0}

注意16行那里5英寸先转换为厘米然后又转回英寸。换句话说,一个函数的结果可以作为另一个函数的参数。考虑16行是怎么工作的。首先{inch,5}作为一个参数传递给convert_length,然后{inch,5}匹配convert_length的第一个clause即convert_length({centimeter,X})。可以看出{centimeter,X}不匹配{inch,5}。当前匹配失败,然后尝试下一个clause即convert_length({inch,Y})。该匹配成功,Y绑定为5。

Tuples可以不止两个部分,事实上你想让它有多少它就能有多少,当然前提是每个部分必须是在erlang中有效的项(term)。举个例子,要表示世界各城市的温度:

{moscow, {c, -10}}
{cape_town, {f, 70}}
{paris, {f, 28}}

Tuples有一个固定项数。每一项都称为元素(element)。在{moscow,{c,-10}}中,元素1是moscow,元素 2是{c,-10}。这里c表示Celsius,f表示Fahrenheit。

文章被以下专栏收录
还没有评论
推荐阅读