我只是无法围绕这个工作的 Lua snipplet。
这个:
t = {'a', 'b', 'c'}
for k, v in next, t, nil do
print(k, v)
end
Run Code Online (Sandbox Code Playgroud)
返回这个:
1 a
2 b
3 c
Run Code Online (Sandbox Code Playgroud)
谁能解释一下
next获取t作为其参数?t是有效的to参数fornil需要并被接受为有效步骤?要扩展一些其他答案:
“通用 for 循环”中涉及的值的更具描述性的命名如下:
for k, v1, v2, … in f_step, state, k0 do … end
Run Code Online (Sandbox Code Playgroud)
它像这样循环
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…)
…
Run Code Online (Sandbox Code Playgroud)
并且 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
Run Code Online (Sandbox Code Playgroud)
和常见的
for k, v in pairs( t ) do … end
Run Code Online (Sandbox Code Playgroud)
基本上扩展到
for k, v in next, t, nil do … end
Run Code Online (Sandbox Code Playgroud)
(除非t有一个带有__pairs.的元表)
现在有两个原因为什么你可以明确地写next, t, nil而不是pairs- 混淆那些还不知道这一点的人,或者避免触发__pairs. (为了避免触发__index/ __newindex,你有rawget/ rawset,为了避免__pairs,你明确地写next, t, nil。或者你可能定义function rawpairs( t ) return next, t, nil end并使用它......)