第一版是为 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