【发布时间】:2011-12-31 18:06:01
【问题描述】:
我正在尝试在 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”字段的情况下在任何地方操作我的指针有更好的想法吗?
谢谢,
尼古拉斯。
【问题讨论】:
-
@kikito:先决条件是什么? C++(和许多其他语言)可以很好地与 C 代码互操作。
-
我的意思是,你需要使用 C 吗?您可以在纯 Lua 中执行 OOP,不涉及 C。
-
当然可以,但我需要能够使用 C API 操作 C 数据(这就是重点)。
标签: lua