在像这样使用table.insert(...)
时:
test ={}
table.insert(test, 1)
print(test[1]) -- 1
table.insert(test, 2)
print(test[1]) -- 1
预期的打印结果是
1
1
现在,当您执行此操作时:
local A = { b = {} }
local B = { c = { x=0 } }
function add(t, X)
local temp = B
temp.c = {x=X}
table.insert(t.b, temp)
end
local a = A
add(a, 1)
print(a.b[1].c.x) -- 1
add(a, 2)
print(a.b[1].c.x) -- 2
结果是
1
2
但是它也不应该是1和1吗?这是我的预期行为,因为我两次都访问 inner 表b
的第一个元素。我在这里想念什么?
答案 0 :(得分:3)
我不太了解您要对代码执行的操作,但是您得到2而不是您期望的1,因为第一个和第二个元素指向同一张表,因此您认为的修改仅应用于第二个元素实际上同时应用于这两个元素(由于您的local temp = B
分配,使得每个插入的元素中都使用B
)。
在脚本末尾添加print(a.b[1] == a.b[2])
进行确认。
答案 1 :(得分:0)
问题是Lua不会按值复制表。您需要一种 deep copy 机制来复制表中的所有内容。在提供A
和B
的请求“默认值”的同时,此代码的工作原理与预期的一样。
function init_A(B)
local t = {}
if not (B== nil) then
t.b = B
else
t.b = {}
end
return t
end
function init_B(C)
local t = {}
if not (C== nil) then
t.c = C
else
t.c = { x=0 }
end
return t
end
function add(t, X)
local temp = init_B({x=X})
table.insert(t.b, temp)
end
local a = init_A()
add(a, 1)
print(a.b[1].c.x) -- 1
add(a, 2)
print(a.b[1].c.x) -- 1
print(a.b[2].c.x) -- 2