LUAのオブジェクト指向メモ

LUA でオブジェクト指向のプログラムを書くために必要なメタテーブル周りの動作をメモしておきます。


とりあえず、ソースコードを。

概ね、以下のような手順で作ります。

  • クラスに相当するようなグローバルのテーブルを作る
  • そのテーブルにインスタンス生成用のメソッドを定義する(メンバとして関数を設定する)
    • インスタンスに相当するテーブルを返す
    • テーブルにはメタテーブルを設定する
    • メタテーブルの __index にクラスのテーブルを設定しておく

以下、大事な仕様のメモ。

: 演算子

「:」をつけてメンバーを呼び出すと、第一引数にオブジェクトが渡されるようになります。

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

メタテーブルには、特定のフィールド値を設定しておくことで、特殊な演算を行ったときの動作を定義できます。

表1:
__add + 演算
__sub - 演算
__mul * 演算
__div / 演算
__mod % 演算
__pow ^ ( 累乗 ) 演算
__unm - ( 単項マイナス ) 演算
__idiv // ( 切り捨て除算 ) 演算
__band & ( ビットごとの論理積 ) 演算
__bor | ( ビットごとの論理和 ) 演算
__bxor ~ ( ビットごとの排他的論理和 ) 演算
__bnot ~ ( ビットごとの単項否定 ) 演算
__shl << ( ビットごとの左シフト ) 演算
__shr >> ( ビットごとの右シフト ) 演算
__concat .. ( 連結 ) 演算
__len # ( 長さ ) 演算
__eq == ( 等値比較 ) 演算
__lt < ( より小さい ) 演算
__le <= ( 小さいまたは等しい ) 演算
__index インデックス付きアクセス
__newindex インデックス付き代入

継承などオブジェクト指向のプログラムを組む際に大事なフィールドが「__index」です。__index にはテーブルを設定することができ、元のテーブルにメンバーが存在しない場合に、__index に設定されたテーブルの中からメンバーを検索するようになります。先の例では、new メソッドで返すテーブルには「Length」メソッドはありませんが、__index に VEC2 を設定しているため、VEC2 のメソッドが検索されて呼び出されます。