引用
在 Lua 中,引用(或引用类型)涉及到如何处理表(Arrays,Tables)和其他复杂数据结构。与基本数据类型(如数字、字符串和布尔值)不同,表是引用类型,这意味着它们在内存中的处理方式与基本数据类型有所不同。
我们用到的所有的 table 都是匿名的,所有的变量,只是对其引用而己。我们对于 table
的操作仅仅是对其引用的操作。
对于 Table 的引用,类似于 C++中 shared_ptr 对于对象的托管一样,采用了引用计数
的方式
引用的概念
基本数据类型(例如,数字和字符串)在赋值时会被复制。这意味着,如果你将一个值赋给另一个变量,两个变量将独立,改变一个变量的值不会影响另一个变量。
引用类型(例如,表)在赋值时不会复制表的内容。相反,赋值会将对同一对象的引用传递给另一个变量。因此,改变一个变量的表内容会影响所有引用该表的变量。
-- 基本数据类型示例
local a = 10
local b = a -- 赋值
b = 20 -- 只改变 b 的值
print(a) -- 输出: 10,因为 a 的值没有改变
-- 引用类型示例
local t1 = {
1, 2, 3}
local t2 = t1 -- 赋值引用
t2[1] = 10 -- 改变 t2 的内容
print(t1[1]) -- 输出: 10,t1 的内容也受到影响
-- 输出内容
print(t1[1]) -- 输出: 10
引用的修改
当你通过引用修改一个表时,所有引用该表的变量都会看到这些更改。
注意事项
循环引用: 表中可以包含对自身的引用,形成循环引用。这可能会导致内存泄漏或复杂性增加。
共享数据: 当多个变量引用同一个表时,任何对该表的修改都将影响所有引用该表的变量。这在某些情况下非常有用,但在不希望副作用发生时也需要注意。
使用元表(Metatables): Lua 允许使用元表自定义表的行为(例如,操作符重载、方法调用),这为引用提供了更强大的功能。
表不存在赋值,只有引用。假设 a 引用一张表,b 也引用一张表,现在将 b = a,只能
说 b 不再引用原先的表,现在同 a 引用同一个表。切勿理解为将 a 指向的表中的内容,拷
贝到了 b 引用的表中
拷贝表
- 浅拷贝
浅拷贝仅复制表的第一层元素。如果表中包含其他表(子表),子表仍然是引用的,不会创建新的实例。这种方法适用于简单的表。
function shallowCopy(original