UP | HOME

完整实例

接下来,会用一个更加完整的例子来巩固前面学到的内容

假设有一个世界上各个城市的温度值的列表。其中,一部分是以摄氏度表示,另一部分是华氏温度表示的

首先,将所有的温度都转换为用摄氏度表示,再将温度数据输出:

%% This module is in file tut5.erl

-module(tut).
-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 needed
    {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]).
1> tut5:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}},
{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
moscow          -10 c
cape_town       21.11111111111111 c
stockholm       -4 c
paris           -2.2222222222222223 c
london          2.2222222222222223 c
ok
  1. 第一次调用 format_temps 函数时,City 被赋予值 {moscow,{c,-10}}, Rest 表示剩余的列表。所以调用函数 print_temp(convert_to_celsius({moscow,{c,-10}}))
    • convert_to_celsius({moscow,{c,-10}}) 调用的结果作为另一个函数 print_temp 的参数。当以这样嵌套的方式调用函数时,它们会从内到外计算
    • print_temp 函数调用 io:format 函数
      • ~-15w 表示以 宽度值 15 输出后面的项
  2. 用列表剩余的元素作参数调用 format_temps(Rest)。这与其它语言中 循环构造 很类似 ,虽然这是 规递 的形式
    • 再调用 format_temps 函数时,City 的值为 {cape_town,{f,70}}
  3. 同样的处理过程再重复一次
  4. 上面的过程一直重复到列表为空为止。因为当列表为空时,会匹配 format_temps([]) 语句。此语句会简单的返回原子值 ok
  5. 程序结束
在 shell 测试程序时,输出被分割到了两行中,这是因为输入太长,在一行中不能被全部显示

Next:匹配和作用域

Previous:输出

Home:顺序编程