当前位置: 首页 > 知识库问答 >
问题:

“for in”循环调用在Lua中起作用吗?

刘意
2023-03-14
local iterator   -- to be defined later
function allwords ()
  local state = {line = io.read(), pos = 1}
  return iterator, state
end

function iterator (state)
  while state.line do        -- repeat while there are lines
    -- search for next word
    local s, e = string.find(state.line, "%w+", state.pos)
    if s then                -- found a word?
      -- update next position (after this word)
      state.pos = e + 1
      return string.sub(state.line, s, e)
    else    -- word not found
      state.line = io.read() -- try next line...
      state.pos = 1          -- ... from first position
    end
  end
  return nil                 -- no more lines: end loop
end
--here is the way I use this iterator:
for i ,s in allwords() do
     print (i)
end

似乎“for in”循环隐式调用函数迭代器,参数状态为:i(s)

任何人都能告诉我,发生了什么?

共有1个答案

丌官丰羽
2023-03-14

是的。引用Lua手册

泛型for语句在称为迭代器的函数上工作。在每次迭代中,调用iterator函数以生成一个新值,当这个新值为nil时停止。

通用的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
 类似资料:
  • 问题内容: 这有效: 但是,这不是: 在第二个示例中,数组未添加到自身。 问题答案: 是的,不是 您所做的可能也是有效的代码,但是现在您正在做 它适用于数字类型(我假设您有)。没有数组索引的简化示例: 样品: 输出: -5 -5 5 5 为了清晰起见,从评论中复制: 您基本上是在说。在这种情况下,仅需指示它是一个正整数即可。这是有效的代码,但这不是您想要的。

  • 主要内容:循环控制语句,无限循环,实例很多情况下我们需要做一些有规律性的重复操作,因此在程序中就需要重复执行某些语句。 一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。 循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。 循环语句是由循环体及循环的终止条件两部分组成的。 Lua 语言提供了以下几种循环处理方式: 循环类型 描述 while 循环 在条件为 true 时,让程序重复地执行

  • 很多情况下我们需要做一些有规律性的重复操作,因此在程序中就需要重复执行某些语句。 一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。 循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。 循环语句是由循环体及循环的终止条件两部分组成的。 Lua 语言提供了以下几种循环处理方式: 循环类型 描述 while 循环 在条件为 true 时,让程序重复地执行

  • 问题内容: 我有以下代码: 不幸的是,当被调用时,该点并没有显示,但是我仍然得到了。我尝试单独设置一个新线程,但无济于事。我尝试了其他解决方案(和),但也无济于事。 我的目标是在屏幕上设置一个绿点。你有什么解决办法吗? 问题答案: 您正在阻止Swing事件线程使应用程序进入睡眠状态。 对于简单的动画和游戏循环,请使用Swing计时器。如果需要长时间运行的代码需要在后台运行,请使用后台线程(例如Sw

  • 问题内容: 我希望我的程序一直问这个问题,直到得到可以使用的响应为止,尤其是0到20之间的一个数字。此类中还有很多其他内容,因此这里有一段摘录,其中do- while是(我已经命名了变量以及所有内容。 问题答案: 您在表达式中使用了一个赋值: 您可以替换为 或更好 如果变量和在其他地方未使用,则可以消除它们,从而为您提供: