【问题标题】:Deleting a table passed into a function, within the function在函数内删除传递给函数的表
【发布时间】:2017-04-03 04:10:18
【问题描述】:

如何将传递给函数的表设置为 nil?当我尝试时

local t = {}

function deleteTable(table)
    table = nil
end

deleteTable(t)

什么也没发生,t 仍然指向一个表值。有什么方法可以将传递给函数的表设置为函数内部的nil

编辑:不尝试删除表的内容,我想要的是从函数中删除对表的引用,以便对表进行垃圾收集。由于不知道自己真正想要做什么,我说错了。

【问题讨论】:

  • 也不要使用table 作为参数/变量。它会覆盖表库。这是不好的做法。
  • @warspyking 你是说隐藏/阴影吗?
  • @warspyking 我没有意识到这一点,但我并没有在我的代码中使用它;该功能只是一个示例。谢谢。
  • @deduplicator 我想我应该写它,因为它会覆盖表库的变量,但是是的。你明白了

标签: variables lua lua-table


【解决方案1】:

简单地说,您不能将表设置为nil:
一张桌子就是一张桌子。

可以做的是将指向该表的表的变量或槽设置为nil之类的其他值。
没有办法(在 debug-api 之外)引用局部变量,您需要 table 和 key 才能引用 table 中的插槽。

但即便如此,只有在所有此类引用都消失时,表才会被垃圾收集,而不是立即被收集。
Lua 不进行手动内存管理,而是进行惰性垃圾收集。

【讨论】:

  • 我明白了,有没有办法使用函数将指向表的给定变量设置为零?我问是因为我的程序中的函数除了删除对表的引用之外还有其他事情,每次我使用该函数时调用该函数然后将变量设置为 nil 会很乏味。只有一个变量引用该表,我不需要立即收集该表,因此该部分不是问题。
【解决方案2】:

我相信我找到了解决方案。这对我想做的事情有用吗?

local t = {};

function removeReference(tab)
    --do stuff with tab

    return nil;
end

t = removeReference(t);

在上面的示例中,我可以只执行 t = nil 而不使用函数,但在我的程序中,函数首先对表执行其他操作;我只是希望它以删除引用结束。那么这是最好的解决方案,还是有更理想的方法?

【讨论】:

  • 这行得通,但为什么需要“删除表格”? t 有一个范围。你不能让表一直存在到 t 超出范围吗?
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2018-09-26
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多