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, . 我知道销毁将是我的类型的方法。所以我需要知道如何做and ,并希望避免由 luajit 完成的默认初始化。initdestroy__gcmetatablecreateinit

编辑

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 回答