成对打印一张桌子

时间:2013-10-26 03:17:16

标签: lua lua-table

我正在尝试在函数中使用in pairs但它不起作用,它只打印第一行(键)。这是我的代码:

set = {1,2,3,4};
unset = {5,6,7,8};

    function listen(ftype)
        if (ftype == [[~]]) then
            for num,str in pairs(set) do
                return str;
            end
        end
        if (ftype == [[$]]) then
            for num,str in pairs(unset) do
                return str;
            end
        end
    end

    print(listen([[~]])..[[ =:= ]]..listen([[$]]));

如果我做这样的事情......

for num,str in pairs(unset) do
    print(str);
end

它就像一个魅力。这正是我想要的,但在一个功能中。

2 个答案:

答案 0 :(得分:7)

您可以构建自己的迭代器:

function double_pair(t1, t2)
    local i = 0
    return function() i = i + 1
               return t1[i] and t1[i] .. " =:= " .. t2[i] 
           end
end

然后你可以像这样使用它:

for str in double_pair(set, unset) do
    print(str)
end

输出:

1 =:= 5
2 =:= 6
3 =:= 7
4 =:= 8

请注意,您不需要使用分号来结束语句,除非语句在一行中并且您希望将它们清除。 [[ =:= ]]通常用于构建长多行字符串,通常我们选择使用双引号" =:= "或单引号' =:= '

答案 1 :(得分:2)

函数不能多次返回。在循环中放置一个无条件的return是没有意义的 - 它永远不会进入循环的第二次迭代。

您实际上是在尝试从函数中返回多个值。 Lua支持这一点;例如,你可以return 1,2,3,4。对于未知数量的返回值,您可以在表格中构建它们并在其上调用unpack,如下所示:

function listen(ftype)
    local result = {}
    local num, str
    if (ftype == [[~]]) then
        for num,str in pairs(set) do
            table.insert(result, str)
        end
    elseif (ftype == [[$]]) then
        for num,str in pairs(unset) do
            table.insert(result, str)
        end
    end
    return unpack(result)
end

但由于你的结果已经在几个表中,以这种方式重建它们将是愚蠢的。你可以解压缩原件:

function listen(ftype)
    if (ftype == [[~]]) then
        return unpack(set)
    elseif (ftype == [[$]]) then
        return unpack(unset)
    end
end

大。但是当你将函数调用放入像print语句这样的表达式时,它只会返回第一个值,这会让你回到你开始的位置。

所以要打印你的对,你不能避免不得不:

1)做一些迭代函数

2)在里面实际打印函数

最清晰的解决方案可能是@YuHao建议的自定义迭代器。