LUA:如何在多重赋值中省略多值值

LUA: howto omit a value of a multi-value in a multiple-assignment

提问人:wimalopaan 提问时间:10/28/2021 更新时间:10/28/2021 访问量:80

问:

如果我只想要函数 f() 的第一个和第三个值,我可以执行以下操作:

local a, _, b = f();

由于是一个有效的名称,因此可能会被分配一个大表。__

在上述情况下,有没有办法省略这个分配者?(显然:如果超出范围,则为 gc'ed)。__

LUA 多重分配

评论

5赞 Ivo 10/28/2021
我不确定这是否可能,但也许只是在下一行添加是最好的选择_ = nil
0赞 Piglet 10/28/2021
@IvoBeckers这绝对是最简单的解决方案。实际上有必要这样做的情况应该非常非常罕见。

答:

4赞 Ivo 10/28/2021 #1

不确定它是否有帮助,但也许您可以定义一个帮助程序函数,例如

function firstAndThird(a, b, c)
    return a, c
end

然后像这样使用它

local a, b = firstAndThird(f());

评论

2赞 lhf 10/28/2021
或者避免创建表。function firstAndThird(a,b,c) return a,c end
0赞 Ivo 10/28/2021
@lhf是的,那就更好了。不知道为什么没想到哈哈。我会编辑我的答案,让它变成这样
3赞 Piglet 10/28/2021 #2

在上述情况下,有没有办法将这个分配者省略为 _?

不,如果需要第三个返回值,则无法省略该赋值。您只能通过 引用返回的对象来确保它不保持活动状态。当然,只有在没有其他参考的情况下,这才会有所作为。_

除了使用函数来限制 的范围外,您还可以使用_do end

local a,c
do
  local _ a,_,c = f()
end

或者,只需删除未使用的引用即可。

local a, _, c = f()
_ = nil

评论

0赞 Ivo 10/28/2021
我认为一些换行符会大大改进您的代码。起初,我不明白您在第一个示例中使用的语法,直到我意识到如果我自己编写,我会在几行上编写相同的代码。将所有内容放在一行上有时可能很好,但不应引起任何混淆。但什么是适合作为单行的,当然有点主观。
1赞 Piglet 10/28/2021
@IvoBeckers我每年唯一一次使用单行本,你抓住我:D