第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但仍有一些不同之处。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还将帮助 支持 Lua 项目


28 – C 中的用户自定义类型

在上一章中,我们了解了如何使用 C 编写的函数扩展 Lua。现在,我们将了解如何使用 C 编写的类型扩展 Lua。我们将从一个小示例开始,并通过元方法和其他优点在本章中对其进行扩展。

我们的示例是一个非常简单的类型:数字数组。此示例的主要动机是它不涉及复杂的算法,因此我们可以专注于 API 问题。尽管很简单,但此类型对某些应用程序很有用。通常,我们不需要 Lua 中的外部数组;哈希表可以很好地完成这项工作。但是,对于大型数组,哈希表可能会占用大量内存,因为对于每个条目,它们必须存储一个通用值、一个链接地址以及一些额外的空间以进行增长。在 C 中直接实现(我们在其中存储数字值,而没有任何额外空间)使用的内存不到哈希表使用的内存的 50%。

我们将使用以下结构表示我们的数组

    typedef struct NumArray {
      int size;
      double values[1];  /* variable part */
    } NumArray;
我们仅将数组 values 声明为大小 1,作为占位符,因为 C 不允许大小为 0 的数组;我们将通过为数组分配的空间定义实际大小。对于包含 n 个元素的数组,我们需要 sizeof(NumArray) + (n-1)*sizeof(double) 字节。(我们从 n 中减去 1,因为原始结构已经包含了一个元素的空间。)