第一版是為 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您也協助 支援 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,因為原始結構已經包含一個元素的空間。)