使用for循环迭代没有索引的表

Dan*_*ter 2 lua

我想在 Lua 中迭代一个表,它可以使用这样的代码(tabline_length并且tab.width之前已经设置过):

for index, tab in ipairs(tabs) do
    tabline_length = tabline_length + tab.width
end
Run Code Online (Sandbox Code Playgroud)

让我(和我的编辑器)有点困扰的是,循环index中定义的变量for没有被使用。我不能tabs在不定义 的情况下迭代表吗index?我测试了以下代码,但它不起作用:

for tab in tabs do
    tabline_length = tabline_length + tab.width
end
Run Code Online (Sandbox Code Playgroud)

LMD*_*LMD 5

您的第一个选择是_按照约定简单地使用未使用的变量(但请仅对局部变量执行此操作,不要使用包含_一些不会被收集的垃圾的条目污染全局变量)。

大多数 Lua linter 都认可此约定,尤其是 Luacheck。你的编辑器可能在底层使用 Luacheck。

或者,您可以实现自己的迭代器ivalues,它将迭代索引保持为“私有”,作为返回的迭代器闭包的上值:

function ivalues(t)
    local i = 0
    return function()
        i = i + 1
        return t[i]
    end
end
Run Code Online (Sandbox Code Playgroud)

然后这可以用作

for tab in ivalues(tabs) do
    ...
end
Run Code Online (Sandbox Code Playgroud)

编写一个(很可能效率较低的)迭代器只是为了丢弃变量是愚蠢的,这就是为什么你通常会发现for _, val in ipairs(vals);但是,当您实现更多迭代器帮助器(例如mapor )时,这样的迭代器会派上用场fold;例如,给定一个sum对迭代器的元素求和的迭代器助手,您可以简单地sum(ivalues(nums))在数字表中查找数字的总和nums。用 来写ipairs会比较尴尬;您可能会重新编写命令式解决方案。