Lua泛型for


在學習Lua泛型for的過程中,我想實現ipairs的功能,寫了如下代碼:

1 function my_ipairs(table_name)
2     local i = 0
3     return function() i = i + 1;return i,table_name[i];end
4 end
5 
6 for k,v in my_ipairs({2,3,5,6}) do
7     print (k,v)
8 end

結果死循環了....

我很疑惑泛型for的工作過程是怎樣的.查閱內容如下:

 

泛型for的語義

泛型for比較復雜,它在循環過程內保存了迭代器函數。它實際上保存着3個值:一個迭代器函數、一個恆定狀態和一個控制變量。接下來,分別進行總結。

泛型for的語法如下:

for <var-list> in <exp-list> do
     <body>
end

其中,<var-list>是一個或多個變量名的列表,以逗號分隔;<exp-list>是一個或多個表達式的列表,同樣以逗號分隔。通常表達式列表只有一個元素,即一句對迭代器函數的調用。例如:

for k, v in pairs(t) do print(k, v) end

for做的第一件事就是對in后面的表達式求值,這些表達式應該返回3個值供for保存:迭代器函數、恆定狀態和控制變量的初值。這里和多重賦值是一樣的,只有最后一個表達式才會產生多個結果,並且只會保留前3個值,多余的值會被丟棄;而不夠的話,就以nil補足。

 

在初始化完成以后,for會以恆定狀態和控制變量來調用迭代器函數。然后for將迭代器函數的返回值賦予變量列表中的變量。如果第一個返回值為nil,那么循環就終止,否則,for執行它的循環體,隨后再次調用迭代器函數,並重復這個過程。在前言部分的代碼中,只是返回了迭代器函數,並沒有返回恆定狀態和控制變量。下面通過代碼來說明這個問題,比如:

for var_1, ..., var_n in <explist> do <block> end -- 就等價於以下代碼:
do
     local _f, _s, _var = <explist>    -- 返回迭代器函數、恆定狀態和控制變量的初值
     while true do
          local var_1, ..., var_n = _f(_s, _var)
          _var = var_1
          if _var == nil then break end
          <block>
          end
     end
end

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM