Пример из учебного раздела: «Определение метаметодов для типа 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
, destroy
. Я знаю, что уничтожение будет __gc
методом моих типов metatable
. Поэтому мне нужно знать, как делать create
и init
, и, надеюсь, избежать инициализации по умолчанию, выполняемой luajit.
редактировать
ffi.new
и другие имеют ряд правил, регулирующих создание типов (задокументировано на странице семантики ffi luajit). это в разделе семантики. Я все еще хотел бы знать, как лучше всего было бы повесить пользовательских создателей и инициализаторов (которые входят в состав библиотеки c) в создание объектов ffi.