首页 > Erlang快速入门 > 3.9 Erlang快速入门之一个复杂些的举例
2013
11-01

3.9 Erlang快速入门之一个复杂些的举例

一个复杂些的举例
现在我们来看一个复杂点的例子来巩固一下目前我们所学到的知识。假设我们有许多关于全世界各地的温度记录,其中一些是用的摄氏度记录,有些是用华氏摄氏度来记录的。首先我们把这些记录都转化成摄氏度,并助把最近的记录打印出来。

%% This module is in file tut5.erl
-module(tut5).
-export([format_temps/1]).

%% Only this function is exported
format_temps([]) ->   %% NO output for an empty list
	ok;
format_temps([City | Rest]) ->
	print_temp(convert_to_celsius(City)),
	format_temps(Rest).

convert_to_celsius({Name, {c, Temp}}) ->   %% NO conversion neeeded
	{Name, {c, Temp}};
convert_to_celsius({Name, {f, Temp}}) ->    %% Do the conversion
	{Name, {c, (Temp - 32) * 5 / 9}}.

print_temp({Name, {c, Temp}}) ->
	io:format("~-15w ~w c~n", [Name, Temp]).

可以点此进行下载代码
shell调用并运行:

26> c(tut5).                                                                     
{ok,tut5}
27> tut5:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c,-4}}]).
moscow          -10 c
cape_town       21.11111111111111 c
stockholm       -4 c
ok
28> 

在我们查看这个程序如何运行之前,需要注意到我们添加了一些注释,每一个注释都是以%开头至该行末尾。同样需要注意 -export([format_temps/1]). 这一行我们仅引入了函数 format_temps/1, 其他的函数我们都没有引入,这些函数被称为本地函数(亦称为局部函数),在模块tut5之外是不可见的,即模块外是不可调用的。

另外,可以看到我们在shell中的输入换行了,这在Erlang是被允许的。

当调用首次format_temps的时候,City获得值{moscow,{c,-10}},并且Rest保存着剩余的列表。然后我们调用函数print_temp(covert_to_celsius({moscow,{c,-10}}))。

convert_to_celsius({moscow,{c,-10}})是作为print_temps的参数。这个嵌套的函数的执行是从内到外的一个过程。首先我们执行convert_to_celsius({moscow,{c,-10}}),因为我们传入的参数已经是使用摄氏度的表达形式了,所以下面我们马上紧接着执行 print_temp({moscow,{c,-10}})。函数convert_to_celsius的工作情况与前面的例子convert_length很类似。

print_temp函数简单的调用了io:format函数。这里的~-15w意思为该元素的限定在15个字符的长度,并且左对齐。

现在我们调用format_temps(Rest),将剩余的部分作为参数传入。这个工作的方式很类似于其他语言中的循环结构(这里是一个递归的过程)。同样的,format_temps函数被再次调用,这次City得到值{cape_town,{f,70}},我们重复上面说过的过程进行数据的处理。我们持续的运行该程序,直到列表为空。当列表为空时,执行第一个子句format_temps([]),程序简单的返回一个常量ok,至此,程序顺利结束。


留下一个回复

你的email不会被公开。