首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LuaBridge迭代Lua中的C数组类型容器类

使用LuaBridge迭代Lua中的C数组类型容器类
EN

Stack Overflow用户
提问于 2021-10-05 12:41:16
回答 1查看 41关注 0票数 1

这可能是一个新手问题,但我还没有找到一个网络搜索的答案,甚至可以帮助我开始。我有一个容器类,它的核心是一个C风格的数组。为了简单起见,让我们这样描述它:

代码语言:javascript
复制
int *myArray = new int[mySize];

使用LuaBridge,我们可以假设我已经成功地将它注册为全局名称空间中的my_array。我想从Lua遍历它,如下所示:

代码语言:javascript
复制
for n in each(my_array) do
   ... -- do something with n
end

我猜我可能需要在全局名称空间中注册一个函数each。问题是,我不知道这个函数在C++中应该是什么样子。

代码语言:javascript
复制
<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接口,该接口很难更改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-06 16:08:46

我在回答我自己的问题,因为我发现这个问题做了一些不正确的假设。我使用的现有代码是一个在c++中实现的true iterator class (在Lua文档中是这样叫的)。这些函数不能与for循环一起使用,但这是在c++中获取回调函数的方式。

为了满足我最初的要求,我们假设已经在lua中使用LuaBridge或任何您喜欢的接口将myArray作为表my_array提供。(这可能需要一个包装类。)您在Lua中完全实现了我所要求的内容,如下所示。(这几乎就是an example in the Lua documentation,但不知何故,我之前错过了它。)

代码语言:javascript
复制
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++添加该函数,如下所示。

代码语言:javascript
复制
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"
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69450654

复制
相关文章

相似问题

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