チュートリアル セクションの例: 「C 型のメタメソッドの定義」は次のようになります。
local ffi = require("ffi")
ffi.cdef[[
typedef struct { double x, y; } point_t;
]]
local point
local mt = {
__add = function(a, b) return point(a.x+b.x, a.y+b.y) end,
__len = function(a) return math.sqrt(a.x*a.x + a.y*a.y) end,
__index = {
area = function(a) return a.x*a.x + a.y*a.y end,
},
}
point = ffi.metatype("point_t", mt)
local a = point(3, 4)
「コンストラクター」がどこにあるのか少し混乱しています。デフォルトpoint(3,4)
では、暗黙のルーティング3 -> x
と5 -> y
. コンストラクターにロジックを掛けたい場合はどうなりますか? 別の言い方をすれば..デフォルト以外のコンストラクタを指定するにはどうすればよいですか?
私は一連の c ライブラリをオブジェクト指向の lua コードにラップしていますが、正規の lua への移植性は気にしません。create
具体的には、オブジェクトの有効期間管理のためにinit
、オブジェクト指向プログラミングの 3 つのコア関数をフックする必要がありますdestroy
。destroy が__gc
私のタイプのメソッドになることはわかっていますmetatable
。そのため、 と の実行方法を知る必要がcreate
ありinit
、できれば luajit によって行われるデフォルトの初期化を回避する必要があります。
編集
ffi.new
および他のものには、型の作成を管理する一連の規則があります (luajit の ffi セマンティクス ページに記載されています)。それはセマンティクスのセクションにあります。カスタムクリエーターとイニシャライザー(acライブラリーの一部として提供される)をffiオブジェクトの作成にぶら下げる最もクリーンな方法は何かを知りたいです。