範性for語義以及pair和ipairs的區別

2022-05-12 06:23:51 字數 1853 閱讀 5617

詳情參考 lua手冊

1. 範性for語義

在了解pair和ipair前先簡單了解下lua中的for迴圈,這裡只闡述範性for迴圈的語義,

範性 for 在自己內部儲存迭代函式,實際上它儲存三個

值:迭代函式、狀態常量、控制變數。for的正規化如下

for

indo

end

是以乙個或多個逗號分隔的變數名列表,是以乙個或多個逗號分隔的表示式列表,通常情況下 exp-list 只有乙個值:迭代函式的呼叫。

for k, v in

pairs(t) do

print

(k, v)

end

首先,初始化,計算 in 後面表示式的值,表示式應該返回範性 for 需要的三個值:迭代函式、狀態常量、控制變數;與多值賦值一樣,如果表示式返回的結果個數不足三個會自動用 nil 補足,多出部分會被忽略。

第二,將狀態常量和控制變數作為引數呼叫迭代函式(注意:對於 for 結構來說,狀態常量沒有用處,僅僅在初始化時獲取他的值並傳遞給迭代函式)。

第三,將迭代函式返回的值賦給變數列表。

第四,如果返回的第乙個值為 nil 迴圈結束,否則執行迴圈體。

第五,回到第二步再次呼叫迭代函式。

2. ipair函式

無狀態的迭代器是指不保留任何狀態的迭代器,因此在迴圈中我們可以利用無狀態迭代器避免建立閉包花費額外的代價。每一次迭代,迭代函式都是用兩個變數(狀態常量和控制變數)的值作為引數被呼叫,乙個無狀態的迭代器只利用這兩個值可以獲取下乙個元素。這種無狀態迭代器的典型的簡單的例子是 ipairs,他遍歷陣列的每乙個元素。

a =  

for i, v in

ipairs(a) do

print

(i, v)

endfunction

iter (a, i)

i = i + 1

local v =a[i]

if v then

return

i, v

endendfunction

ipairs

(a)

return iter, a, 0

end

在上面的**中,ipairs函式返回三個值,迭代函式為iter,a為狀態常量,控制變數的初始值為0,這三者由for語義儲存,每次呼叫迭代函式iter返回表中的key和value,即 i 和 v 的值,可以看到,在pair中,只能遍歷有數字索引的元素。如果出現如下圖的情況,會無法遍歷所有數字索引元素。

3. pair函式

ipair函式主要由lua的內建函式next實現,next原型大致為 next (table [, index])。

它允許程式遍歷表的所有字段。它的第乙個引數是乙個表,它的第二個引數是該表中的索引。 next返回表的下乙個索引及其關聯值。當使用nil作為其第二個引數呼叫時, next返回初始索引及其關

聯值。使用最後乙個索引呼叫時,或者在空表中使用nil時, next返回nil。如果第二個引數不存在,則將其解釋為nil。此外你可以使用next(t)檢查表是否為空。pair有兩種形式,如下。

function

pairs

(t)

return

next, t, nil

endfor k, v in

next, t do

...

end

4. 總結

Lua語言中pairs和ipairs的區別

copy from tbl for key,value in ipairs tbl do print key,value end pairs 函式基本和ipairs 函式用法相同,區別在於 pairs 可以遍歷整個table,即包括陣列及非陣列部分。如有pairs迭代輸出如下 1 alpha 2 b...

例項講解Lua中pair和ipair的區別

採用pair 複製 如下 function print contents pa程式設計客棧rams for k,v in pairs params do print k,v end end print contents 採用inpari 複製 如下 local tt for i,v in ipair...

typedef和 define的用法以及區別

一 typedef的用法 在c c 語言中,typedef常用來定義乙個識別符號及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配記憶體空間,例項像 typedef int int typedef int array 10 typedef int pint typedef可以增強程式的可讀性...