2017-02-17 69 views
2

我只是不能包裹我的頭圍繞這個工作Lua snipplet。爲什麼這在Lua中有效? - 對於K,V在下一個,T,無打印(K,V)結束

此:

t = {'a', 'b', 'c'} 
for k, v in next, t, nil do 
    print(k, v) 
end 

返回此:

1 a 
2 b 
3 c 

有人能解釋,

  • 如何next得到t作爲它的參數?
  • 如何t是一個有效的to參數爲for
  • 爲什麼nil需要和接受有效的一步?
+0

這是相當K表(左數字索引)獲取下一個和v得到t [k](右邊的值),其餘的不知道 – Kaddath

+4

Lua在爲[loop]執行[generic]時將't'作爲'next'的參數(https://www.lua .ORG /手動/ 5.3/manual.html#3.3.5)。這與數字「for」循環不同。 –

+0

是的,現在我明白了。這不是一個數字,而是一個通用的。 'next,t,nil'部分被評估爲'next(t,nil)',現在突然變得有意義......感謝Egor。 –

回答

3

要擴展位上其他答案:

更具描述性的參與「一般的for循環」的值的命名如下:

for k, v1, v2, … in f_step, state, k0 do … end 

和它去像一個循環

k,v1,v2,…=f_step(state,k0) ; if k==nil then break end ; k0=k ; --(…for body here…) 
k,v1,v2,…=f_step(state,k0) ; if k==nil then break end ; k0=k ; --(…for body here…) 
k,v1,v2,…=f_step(state,k0) ; if k==nil then break end ; k0=k ; --(…for body here…) 
… 

和f_step可以隨意修改state在它喜歡的(雖然pairs/next不這樣做,和任何方式又一個例子,string.gmatch甚至完全忽略了statek,而是在關閉中保持所有變化的狀態(如果您還不知道該項,請考慮「函數」)。)


現在,pairs做本質上只是

function pairs(t) 
    -- (__pairs logic goes here, omitted for brevity) 
    return next, t, nil 
end 

和公共

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

基本上擴展到

for k, v in next, t, nil do … end 

(除非t公頃S採用__pairs一元表)

現在有兩個原因,爲什麼您可能會明確寫入next, t, nil,而不是pairs - 蠱惑人心不知道是誰做這個呢,還是避免引發__pairs。 (爲了避免觸發__index/__newindex,你有rawget/rawset,避免__pairs,你明確寫入next, t, nil,或者你定義function rawpairs(t) return next, t, nil end和使用......)

0

所有學分請在Egor之間回答他的回答。

Lua 5.3 manual

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) 
    if var_1 == nil then break end 
    var = var_1 
    block 
    end 
end 

所以原來的語句轉換成一個無限while循環,一直呼籲next(),初始參數爲next(t, nil),並且在每次迭代中,第二個參數將由t表中的下一個索引替換。當最終next(t, index_n)返回nil時,循環中斷。

在我看來,這似乎是一種非常強大的遍歷表的方式,因爲next()可以被完全控制迭代的任何函數替代。哇。

相關問題