是否有任何方法在lua中进行多次赋值,以便右侧的缺失值不被视为nil?
类似于
a,b,c = 1
但是
a = 1, b = 1, c = 1
结果。
不幸的是,
a = b = c = 1
不起作用。
我需要这个,因为我可能在右侧有复杂的表格,我想保持简短(没有任何其他变量)。
答案 0 :(得分:3)
不,这个AFAIK没有捷径。
此外,无论如何,这可能不会像你想要的那样工作。
local some_tbl = {a = 1, b = 2, c = 3}
-- you just assigned the same table to both variables
local a,b = some_tbl, some_tbl
a.a = 5
print(a.a, b.a)
以上代码输出:
>lua -e "io.stdout:setvbuf 'no'" "junk.lua"
5 5
您刚刚更改了两个变量上的表的值(可能不是您想要的,您可能希望为每个变量分配相同的表定义,但每个表包含不同的数据)。
当我有代码,我正在使用相同表结构的单独副本时,我编写一个getter函数来返回具有相同定义的新副本。如果在上面的代码中使用,将如下所示:
function get_TableLayout1()
-- return separate copies of the same table layout
return {a = 1, b = 2, c = 3}
end
local a,b = get_TableLayout1(), get_TableLayout1()
a.a = 5
print(a.a, b.a)
打印出来:
>lua -e "io.stdout:setvbuf 'no'" "junk.lua"
5 1
正如所料。
答案 1 :(得分:3)
你可以使用一个功能:
local a,b,c = (function(t) return t,t,t; end)({1,2,3});
不过,我更喜欢明显的解决方案:只需使用两行
local a = {1,2,3};
local b,c = a,a;
答案 2 :(得分:3)
不。
你的第一个例子(多重赋值)已经有明确定义的语义,所以Lua需要一个加法运算符/关键字/东西来表示对不同语义的需求(重复最后一个r值)。它没有。
你的第二个例子(链接一起分配,ala C)要求赋值是表达式,而在Lua中它们是陈述。
你可以得到的最接近的是定义一个函数,它将一个值推送到堆栈上很多次:
function push(x)
return x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
end
然后你可以说:
a,b,c,d,e,f,g = push(t)
但那很不错。
出于好奇,为什么你需要在同一范围内对同一个表进行一堆不同的引用?
答案 3 :(得分:1)
我希望这对您有用
function push(n, value)
if n <= 0 then
return
elseif n == 1 then
return value
else
return value, push(n - 1, value)
end
end
k, l, o, p = push(3, "foo")
print(k)
print(l)
print(o)
print(p)
-- Output:
-- foo
-- foo
-- foo
-- nil