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