为什么这在Lua有效对于下一个,t,nil中的k,v,不打印(k,v)结束

为什么这在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

我就是不能把我的头缠在这个工作的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 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
      表中的下一个索引替换。当finally
      next(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 feed
      t
      作为
      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