第一版是為 Lua 5.0 編寫的。雖然對後續版本而言仍然十分相關,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買此書,您也協助 支持 Lua 專案。
![]() |
Lua 程式設計 | ![]() |
第一部分。語言 第 5 章。函數 |
Lua 中的參數傳遞機制是位置:當我們呼叫函數時,參數會依據其位置與參數相符。第一個參數會提供值給第一個參數,以此類推。不過,有時指定參數名稱會很有用。為了說明這一點,讓我們考慮函數 rename
(來自 os
函式庫),它會重新命名檔案。我們常常會忘記哪個名稱在前,新的還是舊的;因此,我們可能想要重新定義此函數,以名稱接收其兩個參數
-- invalid code rename(old="temp.lua", new="temp1.lua")Lua 沒有直接支援該語法,但我們可以透過微小的語法變更,得到相同的最終效果。此處的想法是將所有參數封裝到一個表格中,並使用該表格作為函數的唯一參數。Lua 提供的函數呼叫特殊語法,僅將一個表格建構函式作為參數,這有助於這個技巧
rename{old="temp.lua", new="temp1.lua"}因此,我們只使用一個參數定義
rename
,並從此參數取得實際參數
function rename (arg) return os.rename(arg.old, arg.new) end
當函數有許多參數,而且大多數都是選用時,這種參數傳遞風格特別有用。例如,在 GUI 函式庫中建立新視窗的函數可能會有數十個參數,其中大多數是選用的,最好以名稱指定
w = Window{ x=0, y=0, width=300, height=200, title = "Lua", background="blue", border = true }然後,
Window
函數可以自由檢查強制參數、加入預設值等。假設一個原始的 _Window
函數實際建立新視窗(且需要所有參數),我們可以將 Window
定義如下
function Window (options) -- check mandatory options if type(options.title) ~= "string" then error("no title") elseif type(options.width) ~= "number" then error("no width") elseif type(options.height) ~= "number" then error("no height") end -- everything else is optional _Window(options.title, options.x or 0, -- default value options.y or 0, -- default value options.width, options.height, options.background or "white", -- default options.border -- default is false (nil) ) end
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |