我只是不能包裹我的頭圍繞這個工作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
需要和接受有效的一步?
我只是不能包裹我的頭圍繞這個工作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
需要和接受有效的一步?要擴展位上其他答案:
更具描述性的參與「一般的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
甚至完全忽略了state
和k
,而是在關閉中保持所有變化的狀態(如果您還不知道該項,請考慮「函數」)。)
現在,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
和使用......)
所有學分請在Egor之間回答他的回答。
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()
可以被完全控制迭代的任何函數替代。哇。
這是相當K表(左數字索引)獲取下一個和v得到t [k](右邊的值),其餘的不知道 – Kaddath
Lua在爲[loop]執行[generic]時將't'作爲'next'的參數(https://www.lua .ORG /手動/ 5.3/manual.html#3.3.5)。這與數字「for」循環不同。 –
是的,現在我明白了。這不是一個數字,而是一個通用的。 'next,t,nil'部分被評估爲'next(t,nil)',現在突然變得有意義......感謝Egor。 –