gpt4 book ai didi

Lua 多重赋值表

转载 作者:行者123 更新时间:2023-12-04 13:49:03 24 4
gpt4 key购买 nike

这段代码:

function foo()
return 1, 2, 3
end

bar = {}

bar = {a, b, c = foo()}

产生:
bar.a = nil
bar.b = nil
bar.c = 1

怎么写才能得到:
bar.a = 1
bar.b = 2
bar.c = 3

不必写这样的东西:
function foo()
return 1, 2, 3
end

bar = {}
a, b, c = foo()

bar = {a = a, b = b, c = c}

最佳答案

BLUF
没有直接或优雅的方法来做到这一点。你必须像这样手动完成

local r = { f() }           --> store all returned values in r
local bar = { }
local c = string.byte 'a' --> start with 'a'
for _, v in ipairs(r) do
local t = string.char(c)
bar[t] = v --> assign each value to respective letter
c = c + 1
end
如果你有 a, b, c = foo()你会得到分配给三个变量的所有三个值。然而,你已经
bar = { a, b, c = foo() }
table constructor expression将被解释为键 a , b , c被插入到表中,只有最后一个键具有关联值(另外:没有关联值的键被视为 nil ;因此 ab 永远不会被插入)。因为只有一个变量来获取 foo 返回的值,除了第一个它返回的所有其他内容都被丢弃。
或者 bar = { foo() }将分配由 foo 返回的所有值作为 bar 的数组值.但是,访问这些的关键是 [1] , [2]等,而不是 'a' , 'b' , 等等。
阅读以下内容以了解返回值何时被丢弃以及何时不被丢弃。

TL;博士
仅当函数调用是表达式列表中的最后一个/唯一的表达式时,才会保留所有返回值;在其他地方,除了第一个之外的所有内容都被丢弃。
函数调用作为语句
在 Lua 中,当我们从一个函数返回多个结果时,如果函数调用本身就是一个语句,那么所有结果都会被丢弃。
foo()
将丢弃所有三个返回值。
表达式中的函数调用
如果在表达式中使用它,则只会保留第一个,其他所有内容都将被丢弃。
x = foo() - 1
print(x) -- prints 0; the values 2, 3 are discarded
表达式列表中的函数调用
仅当调用显示为表达式列表中的最后/唯一项时,才会保留返回的整个值列表。这样的表达式列表出现在 Lua 的四个地方:
  • 多重分配
    例如。 local a, b, c, d = 0, f() .这里b , c , d获取值 1 , 2 , 3分别。
  • 表构造器
    例如。 local t = { 0, f() } . f 返回的所有值放入t继第一0 .
  • 函数调用参数
    例如。 g(a, f()) . g将收到 4 个,而不是 2 个参数。 a以及来自 f 的三个值.
  • return陈述
    例如。 return 'a', f() .附加到字符串 'a' , f 返回的所有值将在调用端收到。

  • 在所有这些情况下,有 f不是作为列表中的最后一个表达式出现或者不是唯一的表达式,那么它返回的所有值都将被丢弃,除了第一个。
    多重赋值语句
    在多重赋值语句中,当赋值的个数小于变量个数时,多余的变量赋值给 nil .当情况相反时,即如果变量的数量较少,则丢弃额外的值。
    a, b, c = 1, 2         -- a = 1, b = 2, c = nil
    a, b, c = 1, 2, 3, 4 -- 4 gets discarded

    关于Lua 多重赋值表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31780277/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com