この初版は Lua 5.0 用に書かれました。それはまだ後のバージョンにもほぼ関連していますが、いくつかの相違があります。
第4版は Lua 5.3 をターゲットにしており、Amazon や他の書店で入手できます。
書籍を購入することで、Lua プロジェクトの支援にも協力できます。


19.1 – 配列サイズ

Lua では、配列は最初の nil 要素の直前で終了するとよく想定されます。この慣行には1つの欠点があります。配列内には **nil** を含めることができません。配列内のすべての要素が固定された型を持つ場合など、この制限はいくつかのアプリケーションでは妨げにはなりません。しかし、**nil** を配列内に含める必要がある場合もあります。このような場合には、配列の明示的なサイズを保持する方法が必要です。

Table ライブラリは配列サイズを処理する2つの関数を定義します。配列のサイズを返す `getn` と配列のサイズを設定する `setn` です。前述のとおり、テーブルに属性を関連付けるには2つの方法があります。1つはテーブルのフィールドに属性を格納することと、関連付けを行うために別の(弱)テーブルを使用することです。どちらの方法にも長所と短所があります。その理由から、`table` ライブラリは両方を使用します。

通常、`table.setn(t, n)` の呼び出しは `t` を内部(弱)テーブルの `n` に関連付け、`table.getn(t)` の呼び出しは内部テーブルで `t` に関連付けられた値を取得します。ただし、テーブル `t` に数値を持つフィールド `"n"` がある場合、`setn` はこの値を更新し、`getn` はそれを返します。`getn` 関数にはまだ最後のオプションがあります。これらのオプションのいずれかを使用して配列サイズを取得できない場合は、単純な手法を使用します。つまり配列を走査して最初の nil 要素を探します。したがって、配列内ではいつでも `table.getn(t)` を使用して妥当な結果を得ることができます。例を参照してください。

    print(table.getn{10,2,4})          --> 3
    print(table.getn{10,2,nil})        --> 2
    print(table.getn{10,2,nil; n=3})   --> 3
    print(table.getn{n=1000})          --> 1000
    
    a = {}
    print(table.getn(a))               --> 0
    table.setn(a, 10000)
    print(table.getn(a))               --> 10000
    
    a = {n=10}
    print(table.getn(a))               --> 10
    table.setn(a, 10000)
    print(table.getn(a))               --> 10000

デフォルトで、setn および getn は内部テーブルを使用してサイズを保存します。余分な要素によって配列が汚染されないため、これが最もクリーンなオプションです。ただし、n フィールドオプションにもいくつかの利点があります。Lua コアは、引数の数が可変の関数で、arg 配列のサイズを設定するためにこのオプションを使用します。コアはライブラリに依存できないため、setn を使用できません。このオプションのもう 1 つの利点は、例で見たように、配列のサイズをそのコンストラクタで直接設定できることです。

サイズがフィールド n にあることを知っている場合であっても、配列のサイズを操作するために setngetn の両方を使用することはよい習慣です。table ライブラリ (sortconcatinsert など) のすべての関数は、この習慣に従います。実際、フィールド n の値を変更する setn の可能性は、古いバージョンの Lua との互換性の提供のためだけに提供されています。この動作は、言語の将来のバージョンで変更される可能性があります。安全を期すために、この動作を想定しないでください。setn で設定されたサイズを取得するには、常に getn を使用してください。