原因如下:
for i,v in pairs(t) do ... end,這其實只是泛型for的普通用法,for有2種用法
第壹種是 for i = 1,10,1 do print(i) end 這種 當計數器用的。
第二種是泛型for,for a,b,c,d,e in fun1(para) do ... end。
等價於,local fun2 = fun1(para),while true do?a,b,c,d,e = fun2(),?if a then,break?else?......(這裏就是上面寫在do裏面的內容)?end,這裏要求的就是fun1的返回值必須是壹個叠代函數 不然就計算不完了。
lua中的泛型for直接使用talbe的原因:
當我在工作中使用lua 進行開發時,發現在lua 中有4種方式遍歷壹個table ,當然,從本質上來說其實都壹樣,只是形式不同。
XXX 15. end 前兩種是泛型遍歷,後兩種是數值型遍歷。當然妳還會說lua 的table 遍歷還有很多種方法啊,沒錯,不過最常見的這些遍歷確實有必要弄清楚。這四種方式各有特點,由於在工作中我幾乎每天都會使用遍歷table 的方法,壹開始也非常困惑這些方式的不同,壹段時間後才漸漸明白,這裏我也是把自己的壹點經驗告訴大家,對跟我壹樣的lua 初學者也許有些幫助(至少當初我在寫的時候在網上就找了很久,不知道是因為大牛們都認為這些很簡單,不需要說,還是因為我笨,連這都要問)。
準確來說lua 中的table 更加像是C++中的map ,通過Key 對應存儲Value ,但是並非順序來保存key-value 對,而是使用了hash 的方式,這樣能夠更加快速的訪問key 對應的value ,我們也知道hash 表的遍歷需要使用所謂的叠代器來進行,同樣,lua 也有自己的叠代器,就是上面4種遍歷方式中的pairs 和ipairs 遍歷。
但是lua 同時提供了按照key 來遍歷的方式(另外兩種,實質上是壹種),正式因為它提供了這種按key 的遍歷,才造成了我壹開始的困惑,我壹度認為lua 中關於table 的遍歷是按照我table 定義key 的順序來的。