通过引用调用 lua 个表

Call lua tables by reference

一些背景:我在不同的 Lua table 中跟踪不同的硬件资源 - 对于每个硬件资源,我都有一个对应的 Lua table。为了管理所有的资源,我认为创建一个主 table 是有意义的,如果硬件资源是免费的,只需将相应的 table 实体设置为 nil。

下面的例子表明,一个table似乎link另一个table在里面作为参考;但是,如果我将 nil 分配给 table 键,则只有键设置为 nil 而不是我实际希望的 table 本身。 (请参阅最后 5 行的输出。)

local mainTable = {}
local subTable = {x = 123}

mainTable.subkey = subTable
print("The same value.")
print(mainTable.subkey.x)
print(subTable.x)
print("---")

print("The same value.")
mainTable.subkey.x = 456
print(mainTable.subkey.x)
print(subTable.x)
print("---")

print("Tables seem to have the same address.")
print(mainTable.subkey)
print(subTable)
print("---")

print("SubTable seems still to exist, even referance was set to nil")
mainTable.subkey = nil
print(mainTable.subkey)
print(subTable)
print(subTable.x)

输出:

The same value.
123
123
---
The same value.
456
456
---
Tables seem to have the same address.
table: 0x7f17a41596d0
table: 0x7f17a41596d0
---
SubTable seems still to exist, even referance was set to nil
nil
table: 0x7f4b48151710
456

是否可以在不设置 subTable = nil 和 mainTable.subkey = nil 的情况下从 subTable 中删除全部内容? (所以最后调用了 subTable 的 __gc 方法。)

local mainTable = {}
local subTable = {}

在此代码中,您创建了两个 table 变量。一个是mainTable引用的,一个是subTable引用的

mainTable.subTable = subTable

现在我们向已经有引用子表的 table 添加了另一个引用 mainTable.subTable。所以这个 table 变量没有两个引用。

这一行:

mainTable.subTable = nil

只会删除两个引用之一。因此 subTable 仍然是对该 table 的有效引用。只要有任何对该 table 的引用,垃圾收集器就不会触及它。

要删除 table,您必须删除所有引用。您不能直接删除 table。