我对 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它将影响对对象的读取。为什么覆盖不能像这样工作?
表值是通过引用复制的,而不是通过值复制的。
在childA你分配tableC给a. a是本地的childA.
a=tableC只是向所引用的表添加第二个引用tableC。这对实际表或对其的任何其他引用没有影响。
childA返回后,a超出范围,因此您刚刚添加的引用将被删除。
确保您了解使用local tableA = {name = "A"}表构造函数创建表值以及对该表值的{}本地引用。只是创建对该表的另一个引用,而不是第二个表!然后重新引用这里创建的表tableAlocal a = tableAa = tableCalocal tableC = {name = "C"}
您基本上在一张纸上写下另一个地址。这不会影响原来地址的房子。