使用 LuaBridge 从 Lua 迭代 C 数组类型容器 class
Iterating C array-type container class from Lua using LuaBridge
这可能是一个新手问题,但我无法通过网络搜索找到甚至可以帮助我入门的答案。我有一个容器 class,它的核心是一个 C 风格的数组。为简单起见,我们将其描述为:
int *myArray = new int[mySize];
使用 LuaBridge
我们可以假设我已经在全局命名空间中成功将其注册为 my_array
。我想从 Lua 像这样迭代它:
for n in each(my_array) do
... -- do something with n
end
我猜我可能需要在全局命名空间中注册一个函数 each
。问题是,我不知道该函数在 C++ 中应该是什么样子。
<return-type> DoForEach (<function-signature that includes luabridge::LuaRef>)
{
// execute callback using luabridge::LuaRef, which I think I know how to do
return <return-type>; //what do I return here?
}
如果代码使用了 std::vector
,这可能会更容易,但我正在尝试为现有代码库创建一个 Lua 接口,更改起来很复杂。
我在回答我自己的问题,因为我发现这个问题做出了一些不正确的假设。我正在使用的现有代码是用 c++ 实现的 true iterator class(这是 Lua 文档中的名称)。这些不能与 for 循环一起使用,但这就是你在 c++ 中获得回调函数的方式。
为了完成我最初的要求,我们假设我们已经使用 LuaBridge
在 lua 中将 myArray
作为 table my_array
提供或您喜欢的任何界面。 (这可能需要一个包装器 class。)您完全按照 Lua 实现我所要求的,如下所示。 (这几乎完全是 an example in the Lua documentation,但不知何故我之前错过了它。)
function each (t)
local i = 0
local n = table.getn(t)
return function ()
i = i + 1
if i <= n then return t[i] end
end
end
--my_array is a table linked to C++ myArray
--this can be done with a wrapper class if necessary
for n in each(my_array) do
... -- do something with n
end
如果您想为每个 运行 脚本提供 each
函数,您可以在执行脚本之前直接从 C++ 添加它,如下所示。
luaL_dostring(l,
"function each (t)" "\n"
"local i = 0" "\n"
"local n = table.getn(t)" "\n"
"return function ()" "\n"
" i = i + 1" "\n"
" if i <= n then return t[i] end" "\n"
"end" "\n"
"end"
);
这可能是一个新手问题,但我无法通过网络搜索找到甚至可以帮助我入门的答案。我有一个容器 class,它的核心是一个 C 风格的数组。为简单起见,我们将其描述为:
int *myArray = new int[mySize];
使用 LuaBridge
我们可以假设我已经在全局命名空间中成功将其注册为 my_array
。我想从 Lua 像这样迭代它:
for n in each(my_array) do
... -- do something with n
end
我猜我可能需要在全局命名空间中注册一个函数 each
。问题是,我不知道该函数在 C++ 中应该是什么样子。
<return-type> DoForEach (<function-signature that includes luabridge::LuaRef>)
{
// execute callback using luabridge::LuaRef, which I think I know how to do
return <return-type>; //what do I return here?
}
如果代码使用了 std::vector
,这可能会更容易,但我正在尝试为现有代码库创建一个 Lua 接口,更改起来很复杂。
我在回答我自己的问题,因为我发现这个问题做出了一些不正确的假设。我正在使用的现有代码是用 c++ 实现的 true iterator class(这是 Lua 文档中的名称)。这些不能与 for 循环一起使用,但这就是你在 c++ 中获得回调函数的方式。
为了完成我最初的要求,我们假设我们已经使用 LuaBridge
在 lua 中将 myArray
作为 table my_array
提供或您喜欢的任何界面。 (这可能需要一个包装器 class。)您完全按照 Lua 实现我所要求的,如下所示。 (这几乎完全是 an example in the Lua documentation,但不知何故我之前错过了它。)
function each (t)
local i = 0
local n = table.getn(t)
return function ()
i = i + 1
if i <= n then return t[i] end
end
end
--my_array is a table linked to C++ myArray
--this can be done with a wrapper class if necessary
for n in each(my_array) do
... -- do something with n
end
如果您想为每个 运行 脚本提供 each
函数,您可以在执行脚本之前直接从 C++ 添加它,如下所示。
luaL_dostring(l,
"function each (t)" "\n"
"local i = 0" "\n"
"local n = table.getn(t)" "\n"
"return function ()" "\n"
" i = i + 1" "\n"
" if i <= n then return t[i] end" "\n"
"end" "\n"
"end"
);