前言
今天在工作中使用lua编写代码时发生了一个有趣的现象,特此记录一下。
问题再现
当lua的函数为table时会发生什么情况,话不多说直接上代码:
local tb = {1, 2, 3}
function testObject(tab, index)
tab[10] = 110
tab = {4,5,6}
tab = tab[index]
return tab
end
print("tb[2] =", testObject(tb, 2))
for k,v in pairs(tb) do
print(k,v)
end
大家来猜一猜输出结果是什么?反正我是理解错了,我把结果粘出来咱们一起看一下吧
tb[2] = 5
1 1
2 2
3 3
10 110
不知道大家看到这个结果有没有不理解的,反正我一开始是没有明白,但是做了几次试验以后渐渐理解了这种行为…
总结
- 我们都知道lua函数的参数为table时是引用传递,也就是在函数中对参数table的修改会反应到函数的“外部”。
- 如果我是修改参数table的部分字段的时候也确实这样,比如
tab[10] = 110
。 - 但是我如果直接给这个table赋值,它就会变成一个局部变量,切断了和“外部”的联系,比如例子中的
tab
变量。 - 这仅仅是我个人的理解,如果我理解的有问题或者大家有更加真确的解释,欢迎给我留言指出,我会尽快改正的。