【问题标题】:Lua loop knowing when loops endsLua循环知道循环何时结束
【发布时间】:2013-04-05 07:29:46
【问题描述】:

Lua 中是否有一个语句可以让我确定它是否是最后一个循环周期? 当我无法确定将循环多少时间循环时?

例子:

for _, v in pairs(t) do
if I_know_this_is_your_last_cycle then
-- do something
end

【问题讨论】:

  • 您的意思是break 声明吗?是的,它存在于 Lua 中。
  • 你能举一个更好的例子来说明你为什么需要这样做吗?你所做的对我来说有点代码味道......
  • 不,我知道 break,但 break 只会结束循环。对不起,我的例子很糟糕。 for _, v in pairs(t) do if _ == last_cycle_statement then -- do something end 我正在寻找“last_cycle_statement”,如果它当然存在的话。

标签: loops lua


【解决方案1】:

这是missingno答案的简化版::-)

for _, v in pairs(t) do
  if next(t,_) == nil then
    -- do something in last cycle
  end
end

【讨论】:

  • missingno 的答案在哪里?
  • @FaheemMitha hugomg == missingno(这是他 2013 年的旧昵称)
  • 感谢您的澄清。我没想过改名。
【解决方案2】:

你可能会尝试写这样的东西:

    --count how many elements you have in the table
    local element_cnt = 0
    for k,v in pairs(t) do
      element_cnt = element_cnt + 1
    end


    local current_item = 1
    for k,v in pairs(t)
       if current_item == element_count then
         print  "this is the last element"
       end
       current_item = current_item + 1
    end

或者这个:

local last_key = nil
for k,v in pairs(t) do
   last_key = k
end

for k,v in pairs(t) do
  if k == last_key then
--this is the last element
  end
end

【讨论】:

    【解决方案3】:

    一般来说,不会。从Lua docs 中可以看出,for 循环是迭代器顶部的 while 循环的语法糖,因此它只知道循环是否在循环开始时结束。

    如果你真的想检查你是否进入了最后一次迭代,那么我会简单地使用 while 循环显式地编写代码。

    local curr_val = initial_value
    while curr_val ~= nil then
        local next_val = get_next(initial_value)
        if next_val ~= nil then
           --last iteration
        else
           --not last iteration
        end
        curr_val = next_val
    end
    

    如果你想翻译带有pairs函数的例子,你可以使用next函数作为迭代器。


    顺便说一句,我建议在编写这样的循环之前三思而后行。它的编码方式意味着它很容易编写在迭代 0 或 1 个元素时无法正常工作的代码,或者编写无法正确处理最后一个元素的代码。大多数时候编写一个普通的循环并将“最后”代码放在循环之后更合理。

    【讨论】:

      【解决方案4】:

      有几种方法可以做到这一点。最简单的方法是使用标准的 for 循环并自己检查,如下所示:

      local t = {5, nil, 'asdf', {'a'}, nil, 99}
      for i=1, #t do
          if i == #t then
              -- this is the last item.
          end
      end
      

      或者,您可以为表格滚动您自己的迭代器函数,告诉您何时位于最后一项,如下所示:

      function notifyPairs(t)
          local lastItem = false
          local i = 0
          return
            function()
              i = i + 1
              if i == #t then lastItem = true end;
              if (i <= #t) then
                  return lastItem, t[i]
              end
            end
      end
      
      for IsLastItem, value in notifyPairs(t) do
          if IsLastItem then 
              -- do something with the last item
          end
      end
      

      【讨论】:

      • 第一个 sn-p 代码仅适用于索引为从 1 开始的连续整数的表。
      • 是的,他没有给出他的表格的例子,所以我假设他正在像我上面那样构建他的表格(自动生成的索引)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2019-03-17
      • 2021-01-19
      相关资源
      最近更新 更多