gpt4 book ai didi

lua - 在 Lua 中使用元表

转载 作者:行者123 更新时间:2023-12-02 08:51:33 26 4
gpt4 key购买 nike

我正在尝试在 Lua 脚本中实现对象表示法。以下是我使用 C API 成功完成的操作:

  • 我创建了一个新的全局表“Test”作为一个类,并在其中添加了一个字段“new”,指向一个用 C 编写的函数即我可以在 lua 代码中执行此操作:“local obj = Test.new()”(它调用函数“new”)

  • “new”C 函数创建并返回一个新表,并将函数注册为字段(例如“add”、“count”...)即我可以这样做:“obj:add("mike")”和“obj:count()”(obj 作为第一个参数以“:”表示法传递)

2个问题:

1) 一切都按预期工作,但我想知道的是:在我的案例中使用元表有什么优势?我到处都看到元表可以帮助我实现我试图做的事情,但我不明白它们有什么用?将字段作为方法添加到表中不正确吗?元表如何帮助我(如果添加为我的表元表)?

2) 事实上,我在这里试图在 Lua 中重现 C++ 的行为。例如,当我用 C++ 编写此代码时:“Test *obj = new Test();”我希望 C++ 和 Test 的构造函数返回一个 Test 实例的指针。这正是我想让 Lua 为我做的。

问题是我在这种情况下使用了一个表,作为“new”的返回值,但不是一个指针,所以我可以稍后使用 Lua(使用它的字段)调用它的方法,就像一个标准的 C++ 对象(用运算符 ->).

为了能够在 C 函数中检索我的类的实际指针,我在“new”返回的表中添加了一个字段“ptr”(轻型用户值)。没有它,我将只能在我的 C 函数中操作 Lua 表,仅此而已(因此不再需要对真实指针进行方法调用)。

我的第二个问题是,这样做是否正确?对于如何在没有这个“ptr”字段的情况下随处操纵我的指针,您是否有更好的想法?

谢谢,

尼古拉斯。

最佳答案

主要原因是你得到了__index元方法。没有它,对象的每个实例都必须具有与其关联的所有功能:这可以使表变得很大;并使用大量内存。

local methods = { 
foo = function() return "foo" end ;
bar = function() return "bar" end ;
bob = function() return "bob" end ;
hen = function() return "hen" end ;
}

所以你要么

function new_no_mt ( )
local t = {}
for k , v in pairs ( methods ) do t [ k ] = v end
return t
end

对比

local mt = { __index = methods ; }
function new_mt ( )
return setmetatable ( { } , mt )
end

还有其他好处;

  • 定义运营商;
  • 通过比较元表轻松进行类型比较。
  • 更改元表中的方法会更改所有对象的方法,但更改一个对象的方法只会更改该对象的方法。

否则,您尝试做的事情听起来像是用户数据的完美情况。只有当你有一个 __index 元方法时,用户数据才能被索引(没有表可以放入方法)

关于lua - 在 Lua 中使用元表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174579/

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