教程部分中的一个示例:“为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。我知道破坏将是我类型的metatable的metatable方法。因此,我需要知道如何执行create和init,并希望避免使用luajit进行默认初始化。
编辑
ffi.new和其他人有一堆关于类型创建的规则(在luajit的ffi语义页面中有记录)。在语义学部分。我仍然想知道将定制创建者和初始化器(作为c库的一部分)挂在ffi对象创建中的最干净的方法是什么。
发布于 2012-02-21 20:48:17
您需要包装您的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 )注意:所有点类型的对象都已经应用了元类型,所以不需要附加方法或任何东西。
对我来说有点毫无意义..。为什么要分离创建和初始化??
https://stackoverflow.com/questions/9382377
复制相似问题