第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些区别。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助 支持 Lua 项目


17.2 – 对象属性

弱表的另一个重要用途是将属性与对象关联起来。在很多情况下,我们需要将一些属性附加到对象上:函数的名称、表的默认值、数组的大小,等等。

当对象是一个表时,我们可以将属性存储在表本身中,并使用一个适当的唯一键。如前所述,创建唯一键的一种简单且防错的方法是创建一个新对象(通常是一个表),并将其用作键。但是,如果对象不是表,则它无法保留自己的属性。即使对于表,有时我们也可能不想将属性存储在原始对象中。例如,我们可能希望将属性保持为私有,或者我们不希望属性干扰表遍历。在所有这些情况下,我们需要一种替代方法来将属性与对象关联起来。当然,外部表提供了一种将属性与对象关联起来的理想方式(表有时被称为关联数组并非偶然)。我们使用对象作为键,使用它们的属性作为值。外部表可以保留任何类型对象的属性(因为 Lua 允许我们使用任何类型对象作为键)。此外,保存在外部表中的属性不会干扰其他对象,并且可以像表本身一样私有。

然而,这个看似完美的解决方案有一个巨大的缺点:一旦我们在表中将一个对象用作键,我们就将该对象锁定为存在。Lua 无法收集正在用作键的对象。如果我们使用常规表将函数与其名称关联起来,则这些函数将永远不会被收集。正如你所料,我们可以通过使用弱表来避免这个缺点。然而,这次我们需要弱键。弱键的使用不会阻止任何键被收集,只要没有其他对它的引用。另一方面,表不能有弱值;否则,活动对象的属性可能会被收集。

Lua 本身使用这种技术来保持用作数组的表的尺寸。如我们稍后将看到的,表库提供了一个函数来设置数组的大小,另一个函数来获取此大小。当您设置数组的大小时,Lua 会将此大小存储在一个私有弱表中,其中索引是数组本身,值是其大小。