Sol2无法迭代向量

时间:2017-11-03 03:59:47

标签: c++ lua

我正在尝试将一个整数列表提供给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

2 个答案:

答案 0 :(得分:1)

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

问题不在于您的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 containers documentation

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

  • 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是表,但您必须使用句号。

答案 1 :(得分:0)

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

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

这里有两个选项:

  • 实施可以处理您的用户数据类型的pairs版本
  • 将所有元素复制到表格中,然后将其反馈到pairs

还要问问自己,在向量上使用对是否有意义。数字for循环会感觉更自然。我甚至更喜欢ipairs而不是pairs