首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >luajit ffi构造函数参数路由

luajit ffi构造函数参数路由
EN

Stack Overflow用户
提问于 2012-02-21 17:41:03
回答 1查看 782关注 0票数 3

教程部分中的一个示例:“为C类型定义元方法”如下所示:

代码语言:javascript
复制
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。我知道破坏将是我类型的metatablemetatable方法。因此,我需要知道如何执行createinit,并希望避免使用luajit进行默认初始化。

编辑

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-21 20:48:17

您需要包装您的point调用才能得到您想要的:

代码语言:javascript
复制
local function newpoint ( vals )
    -- Do stuff with vals here?
    return point ( vals )
end
newpoint {x=5;y=4}

或者你可以把你的点函数当作你的创建函数,只需要一个init方法.

代码语言:javascript
复制
mt.__index.init = function ( p , x , y )
     p.x = x;
     p.y = y;
end

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

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

对我来说有点毫无意义..。为什么要分离创建和初始化??

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9382377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档