3

チュートリアル セクションの例: 「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 -> x5 -> y. コンストラクターにロジックを掛けたい場合はどうなりますか? 別の言い方をすれば..デフォルト以外のコンストラクタを指定するにはどうすればよいですか?

私は一連の c ライブラリをオブジェクト指向の lua コードにラップしていますが、正規の lua への移植性は気にしません。create具体的には、オブジェクトの有効期間管理のためにinit、オブジェクト指向プログラミングの 3 つのコア関数をフックする必要がありますdestroy。destroy が__gc私のタイプのメソッドになることはわかっていますmetatable。そのため、 と の実行方法を知る必要がcreateありinit、できれば luajit によって行われるデフォルトの初期化を回避する必要があります。

編集

ffi.newおよび他のものには、型の作成を管理する一連の規則があります (luajit の ffi セマンティクス ページに記載されています)。それはセマンティクスのセクションにあります。カスタムクリエーターとイニシャライザー(acライブラリーの一部として提供される)をffiオブジェクトの作成にぶら下げる最もクリーンな方法は何かを知りたいです。

4

1 に答える 1

3

point必要なものを取得するには、呼び出しをラップする必要があります。

local function newpoint ( vals )
    -- Do stuff with vals here?
    return point ( vals )
end
newpoint {x=5;y=4}

または、ポイント関数を作成関数と見なすことができます。そして、initメソッドを持っているだけです...

mt.__index.init = function ( p , x , y )
     p.x = x;
     p.y = y;
end

local mypoint = point()
mypoint:init ( 1 , 2 )

ノート; ポイント型のすべてのオブジェクトには既にメタテーブルが適用されているため、メソッドなどをアタッチする必要はありません。

私には少し無意味に思えます....なぜ作成と初期化を分けたいのですか??

于 2012-02-21T20:48:17.367 に答える