Lua語法小貼士(十六)pairs和next

今天看到一個帖子,是關於lua優化的,上面說清空一個表的時候,pairs的效率是next的500倍。
我記得for pairs循環實際上就是調用的就是next,還特意查了源碼,應證了我的記憶。
源碼就不貼了,直接給結論。


for k, v in pairs(tbl) do
end

基本等同於

for k, v in next, tbl, nil do
end

pairs(tbl)返回三個值,稱爲迭代方法(源碼註釋中爲generator)、狀態和初始值。

而實際上這個三個值便是next,tbl和nil。

第一次循環,將tbl和nil傳入next方法,返回k和v(如果是空表,返回nil,中斷循環)。

第二次循環,將tbl和k傳入next方法,返回新的k和v(如果是空表,返回nil,中斷循環)。

……


ipairs與之類似,只不過ipairs返回的迭代方法是一個沒有暴露出來的方法,而初始值是0。

第一次循環,將tbl和i(初始值0)傳入迭代方法,i++,然後用rawgeti獲取第一個值v,返回i和v(如果是空表,直接返回,中斷循環)。

第二次循環,將tbl和i(當前值1)傳入迭代方法,i++,然後用rawgeti獲取第二個值v,返回i和v(如果是空表,直接返回,中斷循環)。

……


因爲帖子沒有給出代碼,我也不敢武斷的就說對方是錯的。但是我認爲,沒有上下文的情況下,對方直接給出pairs比next快很多的結論也是有很大問題的。

發佈了157 篇原創文章 · 獲贊 340 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章