为什么这在Lua有效对于下一个,t,nil中的k,v,不打印(k,v)结束
我就是不能把我的头缠在这个工作的Lua snipplet上 这: 返回以下内容:为什么这在Lua有效对于下一个,t,nil中的k,v,不打印(k,v)结束,lua,iterator,next,Lua,Iterator,Next,我就是不能把我的头缠在这个工作的Lua snipplet上 这: 返回以下内容: 1 a 2 b 3 c 有人能解释一下吗 如何获取t作为其参数 对于for 为什么要求并接受nil作为有效步骤 所有的学分都归他在评论中的答案 从: 像这样的陈述 for var_1, ···, var_n in explist do block end 等同于代码: do local f, s, var = explist while true do local va
1 a
2 b
3 c
有人能解释一下吗
- 如何获取
作为其参数t
- 对于
for
- 为什么要求并接受
作为有效步骤nil
- 所有的学分都归他在评论中的答案
从:
像这样的陈述
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(t,nil)
不断调用next()
,并且在每次迭代中,第二个参数被t
表中的下一个索引替换。当finallynext(t,index\n)
返回nil
时,循环中断
在我看来,这是一种非常强大的遍历表的方法,因为
next()
几乎可以被任何能够完全控制迭代的函数所取代。哇。要扩展一下其他答案:
“通用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可以随意修改状态
(尽管配对
/下一步
不要这样做,还有一个例子,字符串.gmatch
甚至完全忽略状态
和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
有一个带有对的元表
)
现在,有两个原因可以解释为什么您可以显式地编写
next,t,nil
而不是pairs
——以迷惑那些还不知道这一点的人,或者避免触发\u pairs
。(为了避免触发\uuuu index
/\uuuu newindex
,您有rawget
/rawset
,为了避免\uu对
,您可以显式地编写next,t,nil
。或者您可以定义函数rawpairs(t)return next,t,nil end
,并使用它……。下一个是k(左边的数字索引)和获得t[k](右边的值)的v,不知道在执行时,restLua feedt
作为next
的参数。这不同于数字“for”循环。是的,现在我明白了。这不是数字for,而是泛型。next,t,nil部分中的作为next(t,nil)进行计算
现在这突然变得有意义了……谢谢Egor。你也可以完全省略nil:对于下一个中的k,v,t do print(k,v)end
for k, v in next, t, nil do … end