Lua   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Lua与表的多重赋值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这段代码:
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,3
end

bar = {}
a,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,c = foo(),你将得到分配给这三个变量的所有三个值.但是,你已经

bar = { a,c = foo() }

这个table constructor expression将被解释为键a,c被插入到表中,只有最后一个键具有相关值(除了:没有相值的键被视为nil;因此a和b永远不会被插入).因为只有一个变量可以获取foo返回的值,除了它返回的其他所有内容都将被丢弃.

或者bar = {foo()}将foo返回的所有值都指定为bar的数组值.但是,访问这些的关键是[1],[2]等,而不是’a’,’B’等.

请阅读下面的内容,了解何时丢弃返回的值以及何时不丢弃.

TL; DR
仅当函数调用是表达式列表中的最后一个/唯一表达式时,才会保留所有返回的值.其他所有人除了第一个被丢弃.

函数调用作为语句

在Lua中,当我们从函数返回多个结果时,如果函数调用本身就是一个语句,它们都会被丢弃.

foo()

将丢弃所有三个返回值.

函数调用表达式

如果它在表达式中使用,则只保留第一个,其他所有内容都将被丢弃.

x = foo() - 1
print(X)        -- prints 0; the values 2,3 are discarded

函数调用表达式列表

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

>多项任务

例如.本地a,c,d = 0,f().这里b,d分别得到值1,3.
>表构造函数

例如. local t = {0,f()}. f返回的所有值都放在第一个0之后的t中.
>函数调用参数

例如. g(a,f()). g会得到4个而不是2个参数. a和f中的三个值.
>退货声明

例如.返回’a’,f().除了字符串’a’之外,f返回的所有值都将在主叫端接收.

所有这些情况下,如果f不是列表中的最后一个表达式或者不是唯一的表达式,那么它返回的所有值除了第一个将被丢弃之外.

多个赋值语句

在多重赋值语句中,当分配的值的数量小于变量的数量时,额外的变量将分配给nil.如果是另一种方式,即如果变量的数量较少,则丢弃额外的值.

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

大佬总结

以上是大佬教程为你收集整理的Lua与表的多重赋值全部内容,希望文章能够帮你解决Lua与表的多重赋值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。