【问题标题】:Call lua tables by reference通过引用调用 lua 表
【发布时间】:2017-07-17 16:36:24
【问题描述】:

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

下面的例子显示一个表格似乎链接了其中的另一个表格作为参考;但是,如果我将 nil 分配给表键,则只有键设置为 nil 而不是表本身,正如我真正希望的那样。 (参考最后 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 方法。)

【问题讨论】:

    标签: lua pass-by-reference


    【解决方案1】:
    local mainTable = {}
    local subTable = {}
    

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

    mainTable.subTable = subTable
    

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

    这一行:

    mainTable.subTable = nil
    

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

    为了摆脱表格,您必须删除所有引用。您不能直接删除表格。

    【讨论】:

    • 谢谢小猪!你在写什么是完全有道理的。我没有那样看。我需要考虑另一种方式来管理我的资源。无论如何,这个问题已经完全回答了。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多