为什么这在 Lua 中有效?- for k, v in next, t, nil do print(k, v) end

Lor*_*rai 4 lua iterator next

我只是无法围绕这个工作的 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参数for
  • 为什么nil需要并被接受为有效步骤?

nob*_*ody 5

要扩展一些其他答案:

“通用 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并使用它......)