LUAのオブジェクト指向メモ
LUA でオブジェクト指向のプログラムを書くために必要なメタテーブル周りの動作をメモしておきます。
とりあえず、ソースコードを。
概ね、以下のような手順で作ります。
- クラスに相当するようなグローバルのテーブルを作る
- そのテーブルにインスタンス生成用のメソッドを定義する(メンバとして関数を設定する)
- インスタンスに相当するテーブルを返す
- テーブルにはメタテーブルを設定する
- メタテーブルの __index にクラスのテーブルを設定しておく
以下、大事な仕様のメモ。
: 演算子
「:」をつけてメンバーを呼び出すと、第一引数にオブジェクトが渡されるようになります。
メタテーブルとメタメソッド
メタテーブルには、特定のフィールド値を設定しておくことで、特殊な演算を行ったときの動作を定義できます。
__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 のメソッドが検索されて呼び出されます。