如何同时使用无状态迭代器并从除了1以外的索引开始

我喜欢 lua 中的 for 循环及其对无状态迭代器,如 pairs/ ipairs的支持,但我不知道如何从除了 1 以外的索引开始使用它们。

点赞
用户5675002
用户5675002

虽然迭代器是无状态的,意味着它们不持有任何状态,但循环本身仍然有状态。详见手册了解通用循环的详情。你可以设置自定义迭代器的初始值:

local function iter(table, idx)
    idx = idx + 1
    local v = table[idx]
    if v then
        return idx, v
    end
end

local function start_at(table, idx)
    return iter, table, idx-1
end

local values = {33,42,77,91}

for k,v in start_at(values, 3) do
    print(k,v)
end

假设 ipairs 实现永远不会改变,你可以像这样欺骗它:

local values = {33,42,77,91}

for k,v in ipairs(values), values, 3-1 do
    print(k,v)
end

这个示例将使用 ipairs 返回的默认迭代器,同时在循环状态中删除其他值,并以改变后的初始值代替它。虽然不会在你的代码中实际使用,但它阐述了一个思路。

2017-04-30 07:59:11