Lua 返回多个值的函数
我的问题是关于像对这样的函数。像这样的函数会返回多个值,如下所示:Lua 返回多个值的函数,lua,Lua,我的问题是关于像对这样的函数。像这样的函数会返回多个值,如下所示: function foo() x = bar() y = x*2 return x, y end x, y = foo() 有没有一种方法可以只获取第二个值而不必考虑第一个值?为什么这比简单地返回一张桌子更好 在我看来,这个问题可能已经存在于这个网站上,但我找不到它。如果是重复的,很抱歉。使用下划线 在Lua中,习惯用法是使用下划线丢弃不需要的值: _, y = foo() 当您在源代码中遇到
function foo()
x = bar()
y = x*2
return x, y
end
x, y = foo()
有没有一种方法可以只获取第二个值而不必考虑第一个值?为什么这比简单地返回一张桌子更好
在我看来,这个问题可能已经存在于这个网站上,但我找不到它。如果是重复的,很抱歉。使用下划线
在Lua中,习惯用法是使用下划线丢弃不需要的值:
_, y = foo()
当您在源代码中遇到类似于x,y=foo的东西时,您希望同时使用x和y,但是下划线约定传达了这样一种意图,即不需要并且不会使用分配给u的值
这似乎是最常见的方法,也是Lua编程中最常用的方法。这个习惯用法经常出现在使用迭代器的循环中。例如,ipairs迭代器函数同时返回索引和值,但您可能只对值感兴趣。通常的习惯用法是:
for _, v in ipairs(t) do
-- some stuff using v
end
使用选择
该函数接受一个初始参数(可能是数字或字符串)和任意数量的附加参数。当初始参数为数字N时,将返回从N开始的所有附加参数。由于Lua会丢弃未赋值的值,因此可以使用此选项选择单个参数:
y = select(2, foo())
OP示例函数返回两个值,但对于返回两个以上值的函数:
y, z = select(2, bar())
及
两者都将第二个和第三个返回值分别指定给y和z
在我看来,下划线方法不那么冗长,而且更清晰。使用select还会增加额外函数调用的开销。在某些情况下,使用select更有意义,例如,当您希望以编程方式选择返回值时。你选择哪种方法在很大程度上取决于你的品味
在表中包装返回值
有时将多个返回值包装在一个表中是有意义的,但一般来说,这不是一个好主意。在函数内部的表中包装值意味着必须创建一个新表,这需要时间;在循环中,这可能意味着代码的速度要慢得多
您可能会遇到这样的情况:返回一个表有助于澄清代码,例如,返回某些数据的平均值、中值和模式的函数stats。在这种情况下,您可能希望在表中收集这些统计信息,而不是将它们作为单独的值返回
如果函数返回的值作为一个表是有意义的,则返回一个表
最后的想法
使用使代码最清晰的方法。就我个人而言,下划线方法是实现这一点的默认方法。如果您有充分的理由使用其他方法之一,请遵循您的意愿。您可以使用内置的选择功能:
功能测试
回复你好,世界
终止
本地x=选择2,测试
printx-打印世界
这也显示在Hello中
我喜欢返回多个结果的表。
例如debug.getinfo或其他函数
但是你必须关心一个表的长度,它取决于内容。
已命名且可以使用点访问的密钥是不可计数的
请注意,您还可以执行x,y=foo;_ux表示x未使用,但您仍给它一个有意义的名称,以便用户知道您要丢弃的是什么。您是对的:上下文和命名略有不同,可能这就是您没有找到它的原因。
_, y, z = bar()
several_results=function() return {os.date(), os.time()} end
tab=several_results()
print(#tab) -- How many keys?
print(tab[1], tab[2]) -- For both values
print(tab[2]) -- Get value only from second key
print(tab[#tab]) -- For the value of last key
-- And a simple loop...
for incr=1,#tab do print(tab[incr]) end
tab={}
tab['name']='Arthur Dent'
print(#tab, tab.name)
-- puts out: 0 Arthur Dent
-- Same with Zero and negative numbers
tab={[0]=0,[-1]=-1}
print(#tab, tab[0], tab[-1])
-- puts out: 0 0 -1