高階用法

如基本示例中所述,你可以使用變數繫結引數和變數引數列表(...)。你可以使用此事實遞迴拉出列表,就像在其他語言(如 Haskell)中一樣。以下是利用這一點的 foldr() 的實現。每個遞迴呼叫將 vararg 列表的頭部繫結到 x,並將列表的其餘部分傳遞給遞迴呼叫。這會破壞列表,直到只有一個引數(select('#', ...) == 0)。之後,使用先前計算的結果將每個值應用於函式引數 f

function foldr(f, ...)
    if select('#', ...) < 2 then return ... end
    local function helper(x, ...)
        if select('#', ...) == 0 then
          return x
        end
        return f(x, helper(...))
    end
    return helper(...)
end

function sum(a, b)
    return a + b
end

foldr(sum, 1, 2, 3, 4)
--> 10    

你可以找到其他功能的定義是利用這種程式設計風格在這裡通過問題#8 問題#3。

Lua 唯一慣用的資料結構就是表格。如果在序列中的任何位置存在 nils,則表長度運算子是未定義的。與表格不同,vararg 列表尊重明確的 nils,如基本示例和備註部分所述(如果你還沒有,請閱讀該部分)。由於工作量很小,vararg 列表可以執行除突變之外的每個操作。這使得 vararg 列表成為實現不可變元組的良好候選者。

function tuple(...)
    -- packages a vararg list into an easily passable value
    local co = coroutine.wrap(function(...)
        coroutine.yield()
        while true do
            coroutine.yield(...)
        end
    end)
    co(...)
    return co
end

local t = tuple((function() return 1, 2, nil, 4, 5 end)())

print(t())                 --> 1    2    nil    4    5    | easily unpack for multiple args
local a, b, d = t()        --> a = 1, b = 2, c = nil      | destructure the tuple
print((select(4, t())))    --> 4                          | index the tuple
print(select('#', t()))    --> 5                          | find the tuple arity (nil respecting)

local function change_index(tpl, i, v)
    -- sets a value at an index in a tuple (non-mutating)
    local function helper(n, x, ...)
        if select('#', ...) == 0 then
            if n == i then
                return v
            else
                return x
            end
        else
            if n == i then
                return v, helper(n+1, ...)
            else
                return x, helper(n+1, ...)
            end
        end
    end
    return tuple(helper(1, tpl()))
end

local n = change_index(t, 3, 3)
print(t())                 --> 1    2    nil    4    5
print(n())                 --> 1    2    3    4    5

上面和表之間的主要區別在於表是可變的並且具有指標語義,其中元組沒有這些屬性。另外,元組可以包含明確的 nil 並且具有從未未定義的長度操作。