在學習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
