Sol2无法迭代向量

我试图向Lua脚本提供一个整数列表,并对它们进行迭代。

我收到的错误是:

test.lua:12: bad argument #1 to 'pairs' (table expected, got userdata) stack traceback: [C]: in function 'pairs' test.lua:12: in main chunk

正在使用的C++代码:

#include <sol.hpp>

struct Test {
    std::vector<int> a;
};

int main(void) {
    sol::state lua;

    lua.open_libraries(sol::lib::base);

    lua.new_usertype<Test>("test",
        "a", &Test::a);

    lua.script_file("test.lua", [](lua_State* L, sol::protected_function_result pfr) {
        sol::error err = pfr;
        std::cout << err.what() << std::endl;
        return pfr;
    });
}

Lua脚本:

t = test.new()

for i in pairs(t.a) do
  print(i)
end
点赞
用户2858170
用户2858170

pairs 是 Lua 函数,只接受类型为 table 的单个输入变量。而 t 的类型是 userdata,因此会出现错误。

https://www.lua.org/manual/5.3/manual.html#pdf-pairs

你有两个选择:

  • 实现一个能够处理你的 userdata 类型的 pairs 版本。
  • 在将其传递给 pairs 之前将所有元素复制到一个表中。

同时考虑在向量上使用 pairs 是否有任何意义。使用数值 for 循环会更自然。甚至我会选择 ipairs 而不是 pairs

2017-11-03 09:04:26
用户1845233
用户1845233

所以我知道这是一个老问题,但当我第一次学习如何做这个时,我遇到了这个问题,所以我想为任何现在遇到这个问题的人添加这个答案。

问题不在于您的 C++ 代码,而在于您的 Lua 代码。Lua 使用冒号(:)而不是句点(.)进行成员调用,因此它应该如下所示:

t = test:new()

for k,v in pairs(t.a) do
  print(v)
end

强调成员调用,注意。属性仍然使用句点访问。如果您有一个名为 CObject 的用户类型,其中包含函数 ExFnc,您可以使用以下两种方式之一在对象 ExampleObj 上调用它:

ExampleObj:ExFnc()

或者

CObject.ExFnc(ExampleObj)

sol(至少我使用的版本 3.0.2)已经提供了一整套容器映射,这些容器映射已经包含在内,可以直接使用。您可以在这里找到有关它们的详细信息: sol 3.0.2 容器文档

它列出了与以下类型的自动兼容性:

  • std::vector
  • std::deque
  • std::list
  • std::forward_list
  • std::array
  • std::set
  • std::multi_set
  • std::map
  • std::multi_map
  • std::unordered_set
  • std::unordered_multiset
  • std::unordered_map
  • std::unordered_multimap

但请记住,在 sol 中,NAMESPACES 是表,必须使用句点。

2019-06-28 17:40:48