打印成对的表格

我试图在函数内部使用 in pairs ,但它不起作用,只打印第一行(key)。这是我的代码:

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

它像魔术一样工作。这正是我想要的,但是在函数内部。

点赞
用户1009479
用户1009479

你可以建立自己的迭代器:

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

请注意,你不需要使用分号来结束语句,除非这些语句在一行中并且你想要使它们明确。而 " =:= "' =:= ' 通常用于构建长的多行字符串。

2013-10-26 03:36:54
用户797049
用户797049

一个函数不能返回多次。在循环内部放置无条件的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所建议的。

2013-10-26 03:45:30