3

在 lua 中是否有任何方法可以进行多重赋值,以使右侧的缺失值不被视为 nil ?

类似于

     a,b,c = 1

但得到

     a = 1, b = 1, c = 1

结果。

很遗憾,

    a = b = c = 1

不起作用。

我需要这个,因为我可能在右侧有复杂的表,我想保持简短(没有任何额外的变量)。

4

4 回答 4

4

没有。

你的第一个例子(多重赋值)已经有明确定义的语义,所以 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)

但这很笨拙。


出于好奇,为什么您需要在同一范围内对同一个表进行一堆不同的引用?

于 2012-06-01T21:52:40.937 回答
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;
于 2012-06-01T14:42:45.393 回答
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

您刚刚更改了两个变量上表的 a 值(这可能不是您想要的,您可能希望为每个变量分配相同的表定义,但每个表包含不同的数据)。

当我有代码处理相同表结构的单独副本时,我编写了一个 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

正如预期的那样。

于 2012-06-01T00:03:47.610 回答
2

我希望这对你有用

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
于 2020-01-27T22:17:50.343 回答