Lua多重赋值

有没有办法在 Lua 中进行多重赋值,使右侧缺失的值不被视为 nil?

类似于

     a,b,c = 1

但是结果为

     a = 1, b = 1, c = 1

不幸的是,

    a = b = c = 1

行不通。

我需要这个功能,因为在右侧可能有复杂的表,我希望保持简短和简单(不需要任何额外变量)。

点赞
用户1208078
用户1208078

不,据我所知没有捷径。

此外,这种方法可能不适用于表格数值的工作方式。

local some_tbl = {a = 1, b = 2, c = 3}
-- 你刚刚将相同的表格分配给了两个变量
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

你刚刚改变了这两个变量上表格的 a 值(这可能并不是你想要的,你可能希望将相同的表格定义分配给每个变量,但每个表格都保存不同的数据)。

当我有代码需要使用相同表格结构的分离副本时,我会编写一个 getter 函数来返回具有相同定义的新副本。如果在上面提到的代码中使用,它看起来像这样:

function get_TableLayout1()
    -- 返回相同表格布局的分离副本
    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

如预期。

2012-06-01 00:03:47
用户577603
用户577603

你可以使用一个函数:

local a,b,c = (function(t) return t,t,t; end)({1,2,3});

不过,我更喜欢明显的解决方案:只使用两行

local a = {1,2,3};
local b,c = a,a;
2012-06-01 14:42:45
用户501459
用户501459

不行。

你的第一个例子(多重赋值)已经有了清晰定义的语义,所以 Lua 需要一个额外的操作符/关键字/某种东西来表明不同语义(重复最后一个 r-value)。但它没有。

你的第二个例子(类 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)

但这相当笨拙。


出于好奇,你为什么需要在同一范围内有一堆不同的引用指向同一个表?

2012-06-01 21:52:40
用户12794739
用户12794739

我希望这对你有用

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)

-- 输出:
-- foo
-- foo
-- foo
-- nil
2020-01-27 22:17:50