Lua表的多重分配

问题描述 投票:6回答:4

此代码:

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}
lua
4个回答
6
投票

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将被解释为将键abc插入表中,只有最后一个具有关联值的键(此外:没有关联值的键被视为[ C0];因此nila永远不会插入)。由于只有一个变量可以使用b返回的值,因此除了第一个返回的所有其他内容外,其他所有变量都将被丢弃。

或者foo会将bar = { foo() }返回的所有值分配为foo的数组值。但是,访问这些键的键将是bar[1]等,而不是[2]'a'

阅读下面的内容了解何时返回的值将被丢弃,何时不将其丢弃。


TL; DR仅当函数调用是表达式列表中的最后一个/唯一表达式时,才保留所有返回的值。其他地方,除第一个以外的所有地方都被丢弃。

函数调用作为语句

在Lua中,当我们从一个函数返回多个结果时,如果该函数调用本身是一条语句,则所有这些结果都将被丢弃。

'b'

将丢弃所有三个返回值。

表达式中的函数调用

如果在表达式中使用,则仅保留第一个,而所有其他内容将被丢弃。

foo()

表达式列表中的函数调用

仅当调用在表达式列表中显示为最后/唯一项时,才保留返回的整个值列表。这样的表达式列表出现在Lua的四个地方:

  1. 多次分配

    例如x = foo() - 1 print(x) -- prints 0; the values 2, 3 are discarded 。在此local a, b, c, d = 0, f()bc分别获得值d12

  2. 表构造函数

    例如3local t = { 0, f() }返回的所有值都放在第一个f之后的t中。

  3. 函数调用参数

    例如0g(a, f())将收到4个参数,而不是2个参数。 ga中的三个值。

  4. [f语句

    例如return。除字符串return 'a', f()之外,'a'返回的所有值都将在调用端收到。

在所有这些情况下,如果f不是出现在列表中的最后一个表达式,或者不是唯一的表达式,那么它返回的所有值(第一个表达式除外)都将被丢弃。

多个分配语句

在多重赋值语句中,当赋值的数量小于变量数量时,多余的变量将赋给f。相反,如果变量数量较少,则多余的值将被丢弃。

nil

5
投票
a, b, c = 1, 2         -- a = 1, b = 2, c = nil
a, b, c = 1, 2, 3, 4   -- 4 gets discarded

0
投票
bar = {}
bar.a, bar.b, bar.c = foo()

[简单地,bar = {} local abc = foo() bar.a, bar.b, bar.c = abc, abc, abc 只会将bar.a, bar.b, bar.c = foo()设置为bar.a,其他两个将被设置为foo(),因为它们分别设置为第二个和第三个值,而您只给出了一个值。


0
投票

如果可以,让foo()返回正确格式的表。

nil
© www.soinside.com 2019 - 2024. All rights reserved.