为什么覆盖对象参数无法将新引用传递到外部作用域?

我对 Lua 如何处理函数参数中的对象引用有些困惑。考虑下面这个例子:

local tableA = {name = "A"}
local tableB = {name = "B"}
local tableC = {name = "C"}

local function childA(a, b)
    a = tableC
    b.name = "这可行"
end

local function childB(a, b)
    print("a =", a.name) -- 预期打印 "C"
    print("b =", b.name) -- 如预期打印 "这可行"
end

local function parentFunction(a, b)
    childA(a, b)
    childB(a, b)
end

parentFunction(tableA, tableB)

我期望在 childA 函数中,a 参数将被 tableC 的引用替换,从此时起将一直是 tableC,但实际上并没有。然而,如果我只是改变了参数 b 中的一个属性,则会影响后续对象的读取。为什么覆盖不能像这样工作呢?

原文链接 https://stackoverflow.com/questions/69403080

点赞
stackoverflow用户2858170
stackoverflow用户2858170

表格的值是按照引用而不是按照值进行复制的。

childA中,你将tableC赋值给了aachildA本地的。

a = tableC只是在tableC所指向的表格上添加了第二个引用。这并不会影响实际的表格或者任何其他的引用。

一旦childA返回,a就会超出其作用域,所以你刚刚添加的引用就会被删除。

确保你理解了local tableA = {name = "A"}是在使用表格构造函数{}创建了一个表格值,并且创建了一个本地引用tableA指向那个表格值。local a = tableA只是创建了对那个表格的另一个引用,而不是第二个表格!然后,a = tableC重新引用了在这里创建的表格local tableC = {name = "C"}

你基本上是在一张纸上写了另一个地址。这并不会影响原始地址的房子。

2021-10-01 09:37:09