この初版は Lua 5.0 向けに記述されました。大部分は新バージョンでも引き続き関連していますが、いくつかの違いがあります。
第 4 版は 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;
C ではサイズ 0 の配列は許可されないため、配列 values はサイズ 1 でプレースホルダーとしてのみ宣言します。配列に割り当てるスペースによって実際のサイズを定義します。n 要素を持つ配列では、sizeof(NumArray) + (n-1)*sizeof(double) バイトが必要です。(元の構造にはすでに 1 要素分のスペースが含まれているため、n から 1 を減算します。)