我正在尝试在函数中使用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
它就像一个魅力。这正是我想要的,但在一个功能中。
答案 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建议的自定义迭代器。