鍍金池/ 教程/ 區(qū)塊鏈/ 完整示例
注冊進(jìn)程名稱
錯誤處理
完整示例
分布式編程
消息傳遞
if 與 case
健壯性
映射 (Map)
高階函數(shù) (Fun)
輸出至終端
更多關(guān)于列表的內(nèi)容
內(nèi)置函數(shù) (BIF)
模塊與函數(shù)
將大程序分在多個文件中
匹配、Guards 與變量的作用域
超時
列表
完整示例
頭文件
標(biāo)準(zhǔn)模塊與使用手冊
進(jìn)程
記錄
增加健壯性后的完整示例
Erlang Shell
原子類型

完整示例

接下來,我們會用一個更加完整的例子來鞏固前面學(xué)到的內(nèi)容。假設(shè)你有一個世界上各個城市的溫度值的列表。其中,一部分是以攝氏度表示,另一部分是華氏溫度表示的。首先,我們將所有的溫度都轉(zhuǎn)換為用攝氏度表示,再將溫度數(shù)據(jù)輸出。

%% 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 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]).
35> c(tut5).
{ok,tut5}
36> 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

在分析這段程序前,請先注意我們在代碼中加入了一部分的注釋。從 % 開始,一直到一行的結(jié)束都是注釋的內(nèi)容。另外,-export([format_temps/1]) 只導(dǎo)出了函數(shù) format_temp/1,其它函數(shù)都是局部函數(shù),或者稱之為本地函數(shù)。也就是說,這些函數(shù)在 tut5 外部是不見的,自然不能被其它模塊所調(diào)用。

在 shell 測試程序時,輸出被分割到了兩行中,這是因為輸入太長,在一行中不能被全部顯示。

第一次調(diào)用 format_temps 函數(shù)時,City 被賦予值 {moscow,{c,-10}}, Rest 表示剩余的列表。所以調(diào)用函數(shù) print_temp(convert_to_celsius({moscow,{c,-10}}))。

這里,convert_to_celsius({moscow,{c,-10}}) 調(diào)用的結(jié)果作為另一個函數(shù) print_temp 的參數(shù)。當(dāng)以這樣嵌套的方式調(diào)用函數(shù)時,它們會從內(nèi)到外計算。也就是說,先計算 convert_to_celsius({moscow,{c,-10}}) 得到以攝氏度表示的值 {moscow,{c,-10}}。接下來,執(zhí)行函數(shù) convert_to_celsius 與前面例子中的 convert_length 函數(shù)類似。

print_temp 函數(shù)調(diào)用 io:format 函數(shù),~-15w 表示以寬度值 15 輸出后面的項 (參見STDLIB 的 IO 手冊。)

接下來,用列表剩余的元素作參數(shù)調(diào)用 format_temps(Rest)。這與其它語言中循環(huán)構(gòu)造很類似 (是的,雖然這是規(guī)遞的形式,但是我們并不需要擔(dān)心)。再調(diào)用 format_temps 函數(shù)時,City 的值為 {cape_town,{f,70}},然后同樣的處理過程再重復(fù)一次。上面的過程一直重復(fù)到列表為空為止。因為當(dāng)列表為空時,會匹配 format_temps([]) 語句。此語句會簡單的返回原子值 ok,最后程序結(jié)束。

上一篇:if 與 case下一篇:健壯性