маршрутизация параметров конструктора luajit ffi - PullRequest
3 голосов
/ 21 февраля 2012

Пример из учебного раздела: «Определение метаметодов для типа 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.

1 Ответ

3 голосов
/ 22 февраля 2012

Вам понадобится обернуть ваш 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 )

Примечание;ко всем объектам типа point уже применен ваш метатабельный объект, поэтому вам не нужно прикреплять методы или что-либо еще.

Мне кажется, это немного бессмысленно .... почему вы хотите разделить создание и инициализацию?

...