使用Erlang交互式shell方便測試代碼和程序,但是當(dāng)我們需要編寫大量代碼且后續(xù)仍需Code時(shí),肯定我們需要將Code保存到某個(gè)文件中。這就引入了模塊(module)的概念。
模塊(module)
如果有過編程經(jīng)驗(yàn)的,我們就不會(huì)對模塊的概念感到陌生。其實(shí)Erlang中的模塊跟其他編程語言(Java,Python,C...)相差無幾.
模塊是Erlang中代碼的基本單元,我們所編寫的代碼都存在于模塊之中。模塊文件通常存放在以.erl為擴(kuò)展名的文件中。
創(chuàng)建模塊
IOW,所謂的“創(chuàng)建模塊”其實(shí)也就是新建一個(gè)后綴名為erl的源文件。
編寫模塊時(shí),可以定義2種東西:函數(shù)(function) 和屬性(attribute)
屬性(Attribute):
屬性是元數(shù)據(jù),用來描述模塊自身。如模塊的名字,外部可見的函數(shù)、模塊的作者等...
所有模塊屬性都采用-Name(Attribute).的形式。
模塊中的有一個(gè)必須定義的屬性,且永遠(yuǎn)都是文件的第一個(gè)屬性(第一條語句)。即 -module(ModuleName).
ModuleName是一個(gè)原子。
函數(shù)調(diào)用的形式是M:F(A),其中M是模塊名,F(xiàn)是函數(shù)名,A是函數(shù)參數(shù)。
-module屬性中定義的模塊名和模塊文件的名字必須一致。
當(dāng)模塊文件中有-module(ModuleName). 這一句是就是合法的模塊,但是如果沒有任何函數(shù),該模塊 便毫無用處。
那我們開始定義函數(shù)。
定義函數(shù)
函數(shù)定義的語法遵循 Name(Args) -> Body. 這樣的形式
Name 必須是一個(gè)原子,
Body 必須可以是一個(gè)or多個(gè)用逗號(hào)分隔的Erlang表達(dá)式。
函數(shù)以句號(hào)(.)結(jié)束。
函數(shù)中最后一個(gè)表達(dá)式的執(zhí)行結(jié)果會(huì)被自動(dòng)作為返回值傳遞給調(diào)用者(Erlang 中沒有return 關(guān)鍵字)。
%% Erlang中的函數(shù)定義
add(X,Y) ->
X+Y.
現(xiàn)在模塊有了屬性&函數(shù),應(yīng)該可以使用了吧?
此時(shí)我不得不佩服Erlang的發(fā)明者的高瞻遠(yuǎn)矚和精妙設(shè)計(jì),因?yàn)樗谶@里考慮到了函數(shù)的訪問權(quán)限問題。而且不像Java那樣使用訪問修飾符達(dá)到目的。下面我們來引入第二個(gè)重要的屬性 -export.
export屬性
- export屬性定義的一般形式:
-export([Func1/Arity,F(xiàn)unc2/Arity,...,F(xiàn)uncN/Arity]).
export屬性用來定義模塊中的哪些函數(shù)可以被其他模塊調(diào)用,它接收一個(gè)帶有各自元數(shù)(arity)的函數(shù)名列表。函數(shù)的元數(shù)是個(gè)整數(shù),表示該函數(shù)可以接收的參數(shù)個(gè)數(shù)。這個(gè)arity很重要,因?yàn)樵谕荒K中定義兩個(gè)同名的函數(shù),只要arity個(gè)數(shù)不同,那就是不同的函數(shù)。(避免我們抓耳撓腮,冥思苦想地去給函數(shù)想個(gè)新名字)。
注意:導(dǎo)出的函數(shù)就相當(dāng)于模塊的接口。
在定義接口時(shí),盡量只暴露使用這個(gè)模塊所必需的最少的信息。
import 屬性
- import屬性定義的一般形式:
-import (Module,[Func1/Arity,...,FuncN/Arity).
因?yàn)橐牒瘮?shù)的做法會(huì)降低代碼的可讀性,所以大多數(shù)程序猿都強(qiáng)烈反對在代碼中使用-import屬性,盡管有時(shí)它確實(shí)方便。
來看一下情況:
io:format/2有一個(gè)同名函數(shù),不過在另一個(gè)庫io_lib:format/2中。如果函數(shù)被引入,那么我們要想判斷代碼中使用的到底是哪個(gè)模塊的函數(shù),就have to 跑到文件最前面看-import屬性。
強(qiáng)烈建議:在函數(shù)調(diào)用中包含模塊名,但不絕對。
Erlang的注釋
在Erlang中,注釋都是單行的,以%符號(hào)起始...
在Erlang社區(qū)中,習(xí)慣:
- 模塊的概括性注釋以及模塊的區(qū)段分隔注釋(公有代碼,私有代碼,輔助函數(shù)等)中使用3個(gè)百分號(hào)(%%%);
- 在所有其他需要放置在獨(dú)立行的注釋使用2個(gè)百分號(hào)(%%),并和周邊的代碼采用同樣的縮進(jìn);
- 放在代碼之后的行內(nèi)注釋,使用單個(gè)%;
代碼示例:
%%% first.erl
%%% 定義一個(gè)名為first的模塊文件
-module(first). % 必需屬性,必須寫在第一行,()里必須和模塊文件的名字相同
-export([sayHello(1),add/2]). % 導(dǎo)出的函數(shù)
%% 輸出歡迎語
%% io:format /1 是標(biāo)準(zhǔn)的文本輸出函數(shù)
sayHello(Name) ->
io:format("Hello, -s -n",[Name]). % 注意這里的Name要用[]括起來
%% 加法操作
add(X,Y) ->
X + Y.
我們知道靜態(tài)語言都要經(jīng)歷編譯,執(zhí)行的過程,現(xiàn)在我們可以創(chuàng)建出源代碼了,那么下一步操作就是編譯執(zhí)行環(huán)節(jié)啦。
如果有需要Erlang相關(guān)書籍(PDF)的仁人志士,請下方評(píng)論即可
免費(fèi)贈(zèng)送...
免費(fèi)贈(zèng)送...
免費(fèi)贈(zèng)送...