Lua 中将表及其子表设置为 nil 的区别是什么?
我知道 Lua 在内存中保留表的时间与代码中是否保留对它的引用相关,这意味着你无法通过将它们作为参数传递给函数来将表设置为 nil。但是,我不明白为什么可以对子表这样做。
local a = {}
a.b = {}
local function remove( t )
t.b = nil
t = nil
end
remove( a )
print( a and a.b, a )
将 a 作为参数传递给函数 remove 后,我将参数及其子表设置为了 nil。根据我之前了解的,这不应该将 a 设置为 nil,但是有人能为什么 a.b 可以被设置为 nil,尽管根据我的理解,它应该像 a 一样在外部保有一个引用。
我知道Lua会在代码中的某处仍保留一个表,只要还有对它的引用,
是的,但这只意味着我们不必担心内存管理。除非我们真的在内存上很紧,而必须调整垃圾收集器,否则我们通常不需要考虑何时清除表。在正常使用中,我们可以假设只要失去对其的最后一个引用,表就会从内存中删除。
这意味着你不能通过将表作为参数传递给函数来将其设置为nil。
那并不是真正的原因。表和nil是两种不同的数据类型,因此不能将表字面上设置为nil。通常我们所说的“将表设置为nil”是指采取一个引用表的变量或表键,并将该变量/键设置为nil。这可能是对该表的最后一个引用,也可能不是。
函数无法设置参数变量的原因是,参数(局部于函数)和用作参数的变量是两个完全不同的变量。
但是,有谁能告诉我为什么可以将a.b设置为nil,即使在我理解范围外时,它仍然应该具有对它的引用,就像a一样。
不,表a.b并没有外部引用。没有引用那个表的本地变量。表键没有变量那样的作用域。对该表的唯一引用是在表a内部,该引用会通过语句't.b = nil'进行修改。
语句't.b = nil'可行是因为它修改了多个变量都有的_table_t。't = nil'则将其分配给单独一个变量't',与其他任何变量基本上没有关系。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

严格来说,你并不是在“将
a.b设为nil”。描述t.bil = nil的确切方法是,“将键为“b”的值nil与表a关联”。例如,将你写的内容与以下内容进行比较:
local o = {} o[1] = "one" o[2] = "two" o[3] = "three" -- o 目前看起来像这样 -- KEY | VALUE -- -----+-------- -- 1 | "one" -- 2 | "two" -- 3 | "three" o[2] = nil -- o 现在看起来像这样 -- KEY | VALUE -- -----+-------- -- 1 | "one" -- 3 | "three"很明显,这并不是“将数字
2设为nil”。这只是修改了表o的内容,不再将键2与任何值关联。再回顾一下你最初询问的代码:
local alpha = {} local beta = {} alpha[1] = "one" alpha[2] = beta alpha[3] = "three" -- alpha 现在看起来像这样 -- KEY | VALUE -- -----+-------- -- 1 | "one" -- 2 | <beta> -- 3 | "three" alpha[2] = nil -- alpha 现在看起来像这样 -- KEY | VALUE -- -----+-------- -- 1 | "one" -- 3 | "three"同样,
beta没有以任何方式被修改,数字2也没有被修改。仅仅是从表alpha的内容中删除了将2与值beta关联的内容。