luaでのクラスの継承

また、今日は次のCROWで使う予定でもあるLuaと格闘してました。
Luaオブジェクト指向言語ではないんだけど、
同様なことはテーブルをうまく使うことによって実装できるはずということで、
今日一日かけてどうにか形にできました。


メタテーブルの理解が中途半端だったのが足を引っ張った感じで、
リファレンス読んだり、ネットであちこち検索して調べてました。


とりあえず、わかったことは

  • テーブルとメタテーブルはあくまでも別なもの

 テーブルに関数を追加する要領で__index等の関数を登録しても動作しない

  • ただし、テーブルとメタテーブルは共有できる

 前述の用に単にテーブルに__系の関数を登録しても動作しないが、
 自分自身をメタテーブルとして登録することは可能

  • __indexは別に関数しか登録できないわけではなく、テーブルを登録できる

 つまり、親となるクラスの関数が登録されているテーブルを
 子のクラスの__indexに登録すれば親までさかのぼって関数を呼び出してくれる


大きなところでこんなところです
これらのことがわかったおかげで、C++の継承と同じような形でLuaから関数を呼び出せるようになりました。


思ったことは、実験するならいきなりCからアクセスしないで、
Lua上だけで実験した方がいいですね。
何が問題なのかわかんなくなってしまう
あと、最低スタック内容のダンプぐらいは出来るようにしておかないとはまります。


ちなみに、Lua for Delphiについているデバッガがいろいろと便利です。
Delphi使える人は、一度インストールしてみるといいかも


実装の基本形はliolib.cにあるfile関連の処理ですね。
ここのcreatemeta関数でCで関数テーブルを持つクラスのような物を生成しています。
ようやく、ここでなにやってるかが理解できました。


継承を考えなければほぼコピペそのままで使えますが、親クラスの関数を呼びたい時は、
子となるクラスを同様な形で登録し、親クラスのテーブルをレジストリから取り出し、
そいつを今作った子クラスのテーブルのメタテーブルとして登録すればOK


ここらへんはCaluaやluabind使うとどうにかなるんでしょうかねー
どっちも日本語の資料があまり見つからなかったんで、詳しくは調べてないんですが、
Caluaはアセンブラを使っているので、他環境で使えないのでアウト、
luabindはboostを使ってるんで、これも移植に問題が出そうなんでアウト


今作ってるライブラリはいろんなCPUやコンパイラで使ってるんで、
環境に依存しそうな物は使えないんですよね。
今のとことりあえずコンパイル通るだけでCPUが4種、コンパイラが8種かな?
いろんな環境でコンパイルすると、いろいろ気がつかなかった問題を発見して楽しいです。