打印语句不在 ipirs 循环中执行

我定义了如下表,它包含在字符串索引下定义的表:

local myTable = {
    ["str-1"] = {
        id = 1,
        value = "val"
    },

    ["str-2"] = {
        id = 2,
        value = "val",
    },

    ["str-3"] = {
        id = 3,
        value = "val",
    }
}

for i, table in ipairs(myTable) do
    print(i)
    print(table)
end

我尝试循环遍历表格内容,但 print() 语句不输出任何内容?我已经使用了 print 语句来打印循环当前索引和该位置上的表格。

点赞
用户8982034
用户8982034

这是因为您正在尝试在一个关联数组上使用 ipairs() 循环。

相反,您可以使用支持表索引为关联型的 pairs() 循环进行迭代:

for i, table in pairs(myTable) do
    print(i)
    print(table)
end

一个 pairs() 循环使用键值对并且适用于关联型表,这也导致迭代不按顺序进行,而 ipairs() 使用索引-值对,这种类型的匹配可以用于使用数字索引定义的表。

2021-03-29 05:42:42
用户2858170
用户2858170

Lua参考手册:ipairs中可以看出:

ipairs (t)

返回三个值(一个迭代器函数,表t和0),使得以下结构成立

 for i,v in ipairs(t) do body end

将遍历键值对(1,t[1]),(2,t[2])等,直到第一个索引不存在

可以看出ipairs只适用于序列。

由于您的表中没有任何键值对(1,t[1]),(2,t[2]),因此通用for循环会立即终止。

请使用pairs

如果t具有元方法__pairs,则使用t作为参数调用它并返回调用的前三个结果。

否则,返回三个值:下一个函数,表t和nil,以便以下构造成立

 for k,v in pairs(t) do body end

将遍历表t中的所有键值对

有关在遍历过程中修改表的注意事项,请参见函数next。

2021-03-29 08:15:23
用户11740758
用户11740758

是时候呈现一个既能处理一个表参数,也能处理包含两个数字的表参数的版本了...

tprint = function(self, ...)
    local args = {...}
    local start = args[1]
    local stop = args[2]
    if type(args[1]) == 'number' and type(args[2]) == 'number' then
        for i = start, stop do
            io.write(string.format('%d = %s\n', i, table.concat(self, '', i, i)))
        end
    else
        for key, value in pairs(self) do
            io.write(string.format('%s = %s\n', key, value))
        end
    end
end

当只有一个表参数时,它使用 pairs()

当有一个表和两个数字时,它将打印出起始值(第一个数字)和终止值(第二个数字)。

一个常常以键 0 开始的 arg 例子:

-- 只打印出键0
> tprint(arg,0,0)
0 = /root/lua-5.4.0/src/lua
-- 使用pairs()
> tprint(arg)
1 = -i
2 = -e
3 = setmetatable(arg,{__index={code={},concat=table.concat}});
0 = /root/lua-5.4.0/src/lua

我将其作为一个 arg 的元表方法使用,作为 __call 或/和 __index.tprint

2021-03-29 19:02:53