Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 返回多个值的函数_Lua - Fatal编程技术网

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