メタテーブル
メタテーブルは、オブジェクトの作成や、演算子 (+、-、[]、など) の振る舞いの変更を行うための Lua メソッドです。
Lua の中のすべての値は、メタテーブル を持つことができます。 このメタテーブル は、
特定の操作の下で元の値の振る舞いを定義する、通常の Lua 表です。 値に対する操作の振る舞いのいくつかの側面は、
そのメタテーブル内の特定のフィールドを設定することで変更できます。 例えば、非数値が加算のオペランドである場合、Lua は、
メタテーブルの "__add" フィールドの中に関数があるかどうか検査します。 関数がある場合、Lua はその関数を呼び出して、加算を実行します。
メタテーブルの中のキーをイベント と呼び、値をメタメソッド と呼びます。 前の例では、イベントは "add" で、メタメソッドは加算を実行する関数です。
表および完全ユーザー・データは、個々のメタテーブルを持っています (ただし、 複数の表とユーザー・データはメタテーブルを共有できます)。 他のすべての型の値は、1 つの型に対して 1 つの単一メタテーブルを共有します。つまり、すべての数値に対して 1 つの単一メタテーブルが存在し、すべてのストリングに対して 1 つの単一メタテーブルが存在するというようになります。
メタテーブルは、算術演算、順序付き比較、連結、長さ演算、およびインデックス付けについて、 オブジェクトがどのように振る舞うかを制御します。 これらの各演算に対し、Lua は、イベント と呼ばれる特定のキーを関連付けます。 Lua が値に対してこれらの演算の 1 つを行うとき、その値に、 対応するイベントが入ったメタテーブルがあるかどうか検査されます。 メタテーブルがある場合、そのキーに関連付けられた値 (メタメソッド) は、Lua がその演算をどのように行うかを制御します。
メタテーブルは次にリストした演算を制御します。 各演算は、それに対応する名前で識別されます。 各演算のキーは、
その名前の前に 2 つの下線「__」が付くストリングです。例えば、演算「add」のキーは、ストリング "__add" です。 これらの演算の意味については、インタープリターがどのように演算を実行するかを記述した Lua 関数で詳細に説明します。