- Erlang 教程
- Erlang - 首頁
- Erlang - 概述
- Erlang - 環境
- Erlang - 基本語法
- Erlang - Shell
- Erlang - 資料型別
- Erlang - 變數
- Erlang - 運算子
- Erlang - 迴圈
- Erlang - 決策
- Erlang - 函式
- Erlang - 模組
- Erlang - 遞迴
- Erlang - 數字
- Erlang - 字串
- Erlang - 列表
- Erlang - 檔案 I/O
- Erlang - 原子
- Erlang - 對映
- Erlang - 元組
- Erlang - 記錄
- Erlang - 異常
- Erlang - 宏
- Erlang - 標頭檔案
- Erlang - 預處理器
- Erlang - 模式匹配
- Erlang - 保衛式
- Erlang - BIFs (內建函式)
- Erlang - 二進位制
- Erlang - Fun (匿名函式)
- Erlang - 程序
- Erlang - 郵件
- Erlang - 資料庫
- Erlang - 埠
- Erlang - 分散式程式設計
- Erlang - OTP (開放電信平臺)
- Erlang - 併發
- Erlang - 效能
- Erlang - 驅動程式
- Erlang - Web程式設計
- Erlang 有用資源
- Erlang - 快速指南
- Erlang - 有用資源
- Erlang - 討論
Erlang - 函式
Erlang 是一種函數語言程式設計語言,因此您會期望看到很多關於 Erlang 中函式如何工作的重點。本章涵蓋了 Erlang 中函式的所有功能。
定義函式
函式宣告的語法如下:
語法
FunctionName(Pattern1… PatternN) -> Body;
其中:
FunctionName - 函式名稱是一個原子。
Pattern1… PatternN - 每個引數都是一個模式。引數個數 N 是函式的元數。函式由模組名、函式名和元數唯一確定。也就是說,具有相同名稱並在同一模組中,但元數不同的兩個函式是兩個不同的函式。
Body - 子句體由逗號 (,) 分隔的表示式序列組成。
以下程式是一個簡單的函式使用示例:
示例
-module(helloworld).
-export([add/2,start/0]).
add(X,Y) ->
Z = X+Y,
io:fwrite("~w~n",[Z]).
start() ->
add(5,6).
關於上述程式,需要注意以下幾點:
我們定義了兩個函式,一個是名為 add 的函式,它接受 2 個引數,另一個是 start 函式。
這兩個函式都是用 export 函式定義的。如果我們不這樣做,我們將無法使用該函式。
一個函式可以在另一個函式內部呼叫。這裡我們從 start 函式中呼叫 add 函式。
上述程式的輸出將是:
輸出
11
匿名函式
匿名函式是沒有與其關聯的名稱的函式。Erlang 具有定義匿名函式的功能。以下程式是匿名函式的示例。
示例
-module(helloworld).
-export([start/0]).
start() ->
Fn = fun() ->
io:fwrite("Anonymous Function") end,
Fn().
關於上述示例,需要注意以下幾點:
匿名函式是用 fun() 關鍵字定義的。
函式被賦值給名為 Fn 的變數。
函式透過變數名呼叫。
上述程式的輸出將是:
輸出
Anonymous Function
具有多個引數的函式
Erlang 函式可以用零個或多個引數定義。函式過載也是可能的,您可以多次定義同名函式,只要它們具有不同的引數數量即可。
在以下示例中,函式 demo 為每個函式定義都定義了多個引數。
示例
-module(helloworld).
-export([add/2,add/3,start/0]).
add(X,Y) ->
Z = X+Y,
io:fwrite("~w~n",[Z]).
add(X,Y,Z) ->
A = X+Y+Z,
io:fwrite("~w~n",[A]).
start() ->
add(5,6),
add(5,6,6).
在上述程式中,我們兩次定義了 add 函式。但是第一個 add 函式的定義接受兩個引數,第二個接受三個引數。
上述程式的輸出將是:
輸出
11 17
帶守衛序列的函式
Erlang 中的函式也具有守衛序列的功能。這些只是表示式,只有當它們計算結果為真時,函式才會執行。
帶守衛序列的函式語法如下程式所示。
語法
FunctionName(Pattern1… PatternN) [when GuardSeq1]-> Body;
其中:
FunctionName - 函式名稱是一個原子。
Pattern1… PatternN - 每個引數都是一個模式。引數個數 N 是函式的元數。函式由模組名、函式名和元數唯一確定。也就是說,具有相同名稱並在同一模組中,但元數不同的兩個函式是兩個不同的函式。
Body - 子句體由逗號 (,) 分隔的表示式序列組成。
GuardSeq1 - 這是呼叫函式時將被評估的表示式。
以下程式是帶守衛序列的函式的簡單示例。
示例
-module(helloworld).
-export([add/1,start/0]).
add(X) when X>3 ->
io:fwrite("~w~n",[X]).
start() ->
add(4).
上述程式的輸出為:
輸出
4
如果 add 函式被呼叫為 add(3),程式將導致錯誤。