この第1 版は Lua 5.0 向けに記述されています。最新バージョンでもほとんどが依然として関連していますが、差異があります。
第4 版は Lua 5.3 を対象としており、Amazon で、また他の書店で購入できます。
書籍を購入することで、Lua プロジェクトをサポートすることもできます。


13 – メタテーブルとメタメソッド

通常、Lua のテーブルの操作は予測可能なセットです。キーと値のペアを追加したり、キーに関連付けられた値を確認したり、すべてのキーと値のペアを走査したりできますが、それだけです。テーブルを追加することもテーブルを比較することもテーブルを呼び出すこともできません.

メタテーブルはテーブルの動作を変更できます。たとえば、メタテーブルを使用すると、ab がテーブルであるとき、Lua が式 a+b を計算する方法を定義できます。Lua がテーブルを 2 つ追加しようとするたびに、いずれかがメタテーブルを持っているかどうかと、そのメタテーブルに __add フィールドがあるかどうかをチェックします。Lua がこのフィールドを見つけた場合、その対応する値(メタメソッドと呼ばれ、関数の必要があります)を呼び出して合計を計算します。

Lua の各テーブルは独自のメタテーブルを持つ場合があります。(後ほど説明するように、ユーザーデータにもメタテーブルを持たせることができます。)Lua は常にメタテーブルのない新しいテーブルを作成します。

    t = {}
    print(getmetatable(t))   --> nil
setmetatableを使用して任意のテーブルのメタテーブルを設定または変更できます。
    t1 = {}
    setmetatable(t, t1)
    assert(getmetatable(t) == t1)
任意のテーブルを他のテーブルのメタテーブルにすることができます。関連のあるテーブルのグループは、一般的なメタテーブル(それらの一般的な動作を記述したもの)を共有できます。テーブルは独自にメタテーブルを持つことができます(それによってその独自の個別的動作が記述されます)。すべての構成が有効です。