第一版是為 Lua 5.0 編寫的。雖然對後續版本而言仍然十分相關,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買此書,您也協助 支持 Lua 專案


5.3 – 命名參數

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