为什么覆盖对象参数不会将新引用传递到外部范围?

Egg*_*gon 2 lua

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

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

local function childA(a, b)
    a = tableC
    b.name = "This works"
end

local function childB(a, b)
    print("a =", a.name) -- expected to print "C"
    print("b =", b.name) -- prints "This works" as expected
end

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

parentFunction(tableA, tableB)
Run Code Online (Sandbox Code Playgroud)

我希望在childA函数中a参数将被替换为引用,从现在开始tableC将继续如此tableC,但它不会发生。然而,如果我仅更改参数中此类参数的属性,b它将影响对对象的读取。为什么覆盖不能像这样工作?

Pig*_*let 5

表值是通过引用复制的,而不是通过值复制的。

childA你分配tableCa. a是本地的childA.

a=tableC只是向所引用的表添加第二个引用tableC。这对实际表或对其的任何其他引用没有影响。

childA返回后,a超出范围,因此您刚刚添加的引用将被删除。

确保您了解使用local tableA = {name = "A"}表构造函数创建表值以及对该表值的{}本地引用。只是创建对该表的另一个引用,而不是第二个表!然后重新引用这里创建的表tableAlocal a = tableAa = tableCalocal tableC = {name = "C"}

您基本上在一张纸上写下另一个地址。这不会影响原来地址的房子。