gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:58:00 25 4
gpt4 key购买 nike

我对 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)

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

最佳答案

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

childA中,您将tableC分配给aachildA 本地的。

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

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

确保您了解在 local tableA = {name = "A"} 中,您使用表构造函数 {} 和本地引用 创建表值>tableA 到该表值。 local a = tableA 只是创建对该表的另一个引用,而不是第二个表!然后 a = tableC 重新引用 a 到此处创建的表 local tableC = {name = "C"}

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

关于lua - 为什么覆盖对象参数不会将新引用传递到外部范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69403080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com