1

我正在尝试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

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

4

2 回答 2

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

请注意,您不需要分号来结束您的陈述,除非这些陈述在一行中并且您想让它们清楚。并且[[ =:= ]]通常用于构建长的多行字符串,通常我们选择使用双引号" =:= "或单引号' =:= '

于 2013-10-26T03:36:54.537 回答
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 所建议的,最干净的解决方案可能是自定义迭代器。

于 2013-10-26T03:45:30.227 回答