第一版是針對 Lua 5.0 所寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買這本書,您也同時 贊助 Lua 專案。
![]() |
用 Lua 程式設計 | ![]() |
第一部分。語言 第 7 章。反覆運算器和通用 for |
顧名思義,無狀態反覆運算器是不會儲存任何狀態的反覆運算器。因此,我們可以在多個迴圈中使用同一個無狀態反覆運算器,避免建立新封閉的成本。
在每次反覆運算中,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 會取得
next
、t
和 nil,這正是它呼叫 pairs(t)
時取得的結果。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |