第一版是針對 Lua 5.0 所寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買這本書,您也同時 贊助 Lua 專案


7.3 – 無狀態反覆運算器

顧名思義,無狀態反覆運算器是不會儲存任何狀態的反覆運算器。因此,我們可以在多個迴圈中使用同一個無狀態反覆運算器,避免建立新封閉的成本。

在每次反覆運算中,for 迴圈會呼叫其反覆運算器函數,並提供兩個引數:不變狀態和控制變數。無狀態反覆運算器僅使用這兩個引數來產生反覆運算的下一元素。這種反覆運算器的典型範例是 ipairs,它會反覆運算陣列中的所有元素,如下所示

    a = {"one", "two", "three"}
    for i, v in ipairs(a) do
      print(i, v)
    end
反覆運算的狀態是正在遍歷的表格(不變狀態,在迴圈中不會改變),加上目前的索引(控制變數)。ipairs 和它回傳的反覆運算器都相當簡單;我們可以用 Lua 程式碼寫成如下
    function iter (a, i)
      i = i + 1
      local v = a[i]
      if v then
        return i, v
      end
    end
    
    function ipairs (a)
      return iter, a, 0
    end
當 Lua 在 for 迴圈中呼叫 ipairs(a) 時,它會取得三個值:iter 函數作為反覆運算器,a 作為不變狀態,以及零作為控制變數的初始值。然後,Lua 會呼叫 iter(a, 0),結果會是 1, a[1](除非 a[1] 已經是 nil)。在第二次反覆運算中,它會呼叫 iter(a, 1),結果會是 2, a[2],以此類推,直到第一個 nil 元素。

pairs 函數會反覆運算表格中的所有元素,它很類似,只不過反覆運算器函數是 next 函數,這是 Lua 中的原始函數

    function pairs (t)
      return next, t, nil
    end
next(t, k) 呼叫,其中 k 是表格 t 的一個鍵,會回傳表格中的下一個鍵,順序不拘。(它也會回傳與該鍵相關聯的值,作為第二個回傳值。)next(t, nil) 呼叫會回傳第一個配對。當沒有更多配對時,next 會回傳 nil

有些人偏好直接使用 next,而不呼叫 pairs

    for k, v in next, t do
      ...
    end
請記住,for 迴圈的表達式清單已調整為三個結果,因此 Lua 會取得 nexttnil,這正是它呼叫 pairs(t) 時取得的結果。