Lua 中,如果一个变量包含一个表元素,如果我从实际表中删除该表元素,那么变量会被设置为 nil 吗?

Lua 编程初学者。假设我有一个包含表元素的变量。例如,让 objects 成为某个东西的数组,我也有一个变量 'a'。

a = objects[2] 是我在程序中某些功能中所做的。如果我然后删除 objects 表中的第二个元素,'a' 是否会自动设置为 nil?

点赞
用户2858170
用户2858170

为什么不试一下呢?

local objects = {{}, {}}
local a = objects[2]
table.remove(objects, 2)

print("objects[2]", objects[2])
print("a", a)

输出结果为:

objects[2]  nil
a           table: 0x11196d0(对于您而言,这个值将不同)

您可以看到 a 不是 nil

local objects = {{}, {}} 等价于:

do
  -- 此行创建了一个表和一个名为 objects 的本地引用
  local objects = {}
  -- 此行创建了一个表并将引用存储在 objects[1] 中
  objects[1] = {}
  -- 此行创建了一个表并将引用存储在 objects[2] 中
  objects[2] = {}
end

现在我们创建了 a,它是指向 objects[2] 所引用的表的第二个引用。

-- 这会创建对象[2]所引用的表的本地引用为a
local a = objects[2]

现在我们删除了 objects[2]

-- 此行从表中删除第 2 个字段,从而删除了其中一个引用
table.remove(objects, 2)

在这种情况下,这相当于将 objects[2] 赋值为 nil,这刚刚删除了这个表的两个现有引用中的一个。您将 nil 分配给 objects[2],因此 objects[2] 不再引用该表。

a 仍然是该表的引用。只有当您将 a 设置为 nil 时,该表上就不再有引用了,因为不再可以访问该表。您无法在 Lua 中删除表。您只能将 nil 分配给所有引用,并让垃圾收集器起作用。

2021-04-16 11:56:33