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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |