第一版是為 Lua 5.0 編寫的。儘管在很大程度上仍然適用於後續版本,但仍有一些區別。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您還將幫助 支持 Lua 項目。
![]() |
用 Lua 編程 | ![]() |
第一部分。語言 第 5 章。函數 |
函數是 Lua 中語句和表達式抽象的主要機制。函數既可以執行特定任務(在其他語言中有時稱為程序或子例程),也可以計算並傳回值。在第一種情況下,我們將函數呼叫用作語句;在第二種情況下,我們將其用作表達式
print(8*9, 9/8) a = math.sin(3) + math.cos(10) print(os.date())在這兩種情況下,我們都會寫一個用括號括起來的參數列表。如果函數呼叫沒有參數,我們必須寫一個空列表
()
來表示呼叫。此規則有一個特例:如果函數只有一個參數,並且此參數是字面量字串或表格建構函數,則括號是可選的
print "Hello World" <--> print("Hello World") dofile 'a.lua' <--> dofile ('a.lua') print [[a multi-line <--> print([[a multi-line message]] message]]) f{x=10, y=20} <--> f({x=10, y=20}) type{} <--> type({})
Lua 還提供了一個用於面向對象呼叫的特殊語法,即冒號運算子。o:foo(x)
這樣的表達式只是寫 o.foo(o, x)
的另一種方式,也就是說,呼叫 o.foo
並將 o
作為第一個額外參數添加。在 第 16 章 中,我們將更詳細地討論此類呼叫(和面向對象編程)。
Lua 程式所使用的函數可以在 Lua 和 C(或主機應用程式所使用的任何其他語言)中定義。例如,所有函式庫函數都是用 C 編寫的;但這個事實與 Lua 程式設計師無關。呼叫函數時,用 Lua 定義的函數和用 C 定義的函數之間沒有區別。
正如我們在其他範例中所見,函數定義有一個慣例語法;例如
-- add all elements of array `a' function add (a) local sum = 0 for i,v in ipairs(a) do sum = sum + v end return sum end在該語法中,函數定義有一個名稱(在前一個範例中為
add
)、一個參數列表和一個主體,它是一個語句列表。
參數的工作方式與區域變數完全相同,會使用函式呼叫中提供的實際參數來初始化。您可以使用與參數數量不同的參數數量來呼叫函式。Lua 會調整參數數量以符合參數數量,就像在多重指定中一樣:額外的參數會被捨棄;額外的參數會取得 nil。例如,如果我們有一個函式如下
function f(a, b) return a or b end我們將會有從參數到參數的下列對應
CALL PARAMETERS f(3) a=3, b=nil f(3, 4) a=3, b=4 f(3, 4, 5) a=3, b=4 (5 is discarded)雖然這種行為可能會導致程式設計錯誤(在執行時期很容易發現),但它也很有用,特別是對於預設參數。例如,考慮下列函式,用於遞增全域計數器。
function incCount (n) n = n or 1 count = count + n end此函式有 1 作為其預設參數;也就是說,呼叫
incCount()
,沒有參數,會將 count
遞增 1。當您呼叫 incCount()
時,Lua 會先使用 nil 初始化 n
;or
會產生其第二個運算元;因此 Lua 會將預設 1 指定給 n
。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |