【问题标题】:Functions that return multiple values Lua [duplicate]返回多个值的函数Lua [重复]
【发布时间】:2020-07-23 21:02:15
【问题描述】:

我的问题是关于 pairs() 之类的函数。像这样的函数返回多个像这样的值:

function foo()
     x = bar()
     y = x*2
     return x, y
end

x, y = foo()

有没有办法只获得第二个值而不用担心第一个值?为什么这比简单地返回一个表更好?

在我看来,这个问题可能已经存在于这个网站上,但我找不到它。对不起,如果它是重复的。

【问题讨论】:

标签: lua


【解决方案1】:

使用下划线

在 Lua 中使用下划线丢弃不需要的值是惯用的:

_, y = foo()

当您在源代码中遇到x, y = foo() 之类的内容时,您希望xy 都将被使用,但下划线约定传达的意图是不需要分配给_ 的值,而是将不能用。

这是最常见的方法,并且最常用于Lua 编程。这个习惯用法经常出现在使用迭代器的循环中。例如,ipairs 迭代器函数返回一个索引和一个值,但您可能只对值感兴趣。通常的成语是:

for _, v in ipairs(t) do
   -- some stuff using v
end

使用select

select 函数接受一个初始参数,它可以是一个数字或字符串"#",以及任意数量的附加参数。当初始参数是数字 N 时,返回从第 N 个开始的 所有 个附加参数。由于 Lua 会丢弃未分配的值,因此可以使用它来选择单个参数:

y = select(2, foo())

OP 示例函数返回两个值,但对于返回两个以上值的函数:

y, z = select(2, bar())

_, y, z = bar()

都将bar的第二个和第三个返回值分别赋给yz

在我看来,下划线方法不那么冗长,而且更清晰。使用select 还会增加额外函数调用的开销。在某些情况下使用select 更有意义,例如,当您想以编程方式选择返回值时。您选择哪种方法很大程度上取决于个人喜好。

在表中包装返回值

有时将多个返回值包装在一个表中是有意义的,但作为一般规则,这是一个坏主意。将值包装在函数内部的表中意味着必须创建一个新表,这需要时间;在循环中,这可能意味着代码显着变慢。

您可能会遇到这样的情况,它有助于阐明返回表格的代码,例如,返回某些数据的平均值、中位数和众数的函数 stats。在这种情况下,您可能希望在表格中收集这些统计信息,而不是将它们作为单独的值返回。

如果从函数返回的值作为表有意义,则返回一个表。

最后的想法

使用使您的代码最清晰的方法。为了我的钱,下划线方法是执行此操作的默认方法。如果您有充分的理由使用其他方法之一,请随心所欲。

【讨论】:

  • 注意_x, y = foo()也可以; _ 表示 _x 未使用,但您仍然给它一个有意义的名称,以便用户知道 什么您正在丢弃它。
【解决方案2】:

您可以为此使用内置的select-Function:

function test()
    return "Hello", "World"
end

local x = select(2, test())
print(x) -- prints World

这也显示在documentation

【讨论】:

    【解决方案3】:

    你好

    我喜欢为多个结果返回一个表格。 像 debug.getinfo() 或其他函数。

    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
    

    但是您必须关心取决于内容的表格的 Len ( # )。 已命名且可以用点访问的键是不可数的。

    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
    

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 2012-09-30
      • 2011-04-19
      • 2014-06-23
      • 2021-12-13
      • 2015-07-07
      • 2014-09-12
      相关资源
      最近更新 更多