gpt4 book ai didi

c - luajit ffi构造函数参数路由

转载 作者:行者123 更新时间:2023-12-04 12:00:43 25 4
gpt4 key购买 nike

教程部分中的示例:“为 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 的可移植性。具体来说,我需要挂接面向对象编程的三个核心函数以进行对象生命周期管理,createinitdestroy。我知道 destroy 将是我类型的 metatable__gc 方法。所以我需要知道如何执行 createinit,并希望避免由 luajit 完成的默认初始化。

编辑

ffi.new 和其他人有一系列管理类型创建的规则(记录在 luajit 的 ffi 语义页面中)。它在语义部分。我仍然想知道将自定义创建者和初始化器(作为 c 库的一部分)挂入 ffi 对象创建的最干净的方法是什么。

最佳答案

您需要包装您的 point 调用以获得您想要的:

local function newpoint ( vals )
-- Do stuff with vals here?
return point ( vals )
end
newpoint {x=5;y=4}

或者您可以将点函数视为创建函数;并且只有一个初始化方法...

mt.__index.init = function ( p , x , y )
p.x = x;
p.y = y;
end

local mypoint = point()
mypoint:init ( 1 , 2 )

注意; point 类型的所有对象都已经应用了你的元表,所以你不需要附加方法或任何东西。

这对我来说似乎有点毫无意义....为什么要将创建和初始化分开?

关于c - luajit ffi构造函数参数路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9382377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com