1

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

例子:

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

4 回答 4

8

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

for _, v in pairs(t) do
  if next(t,_) == nil then
    -- do something in last cycle
  end
end
于 2013-04-04T18:52:58.160 回答
1

一般来说,没有。正如您从Lua 文档中看到的那样,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函数翻译例子,你可以使用下一个函数作为迭代器。


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

于 2013-04-04T18:34:06.393 回答
1

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

    --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
于 2013-04-04T18:47:21.440 回答
0

有几种方法可以做到这一点。最简单的方法是使用标准 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
于 2013-04-04T18:40:50.433 回答