我正在尝试将一个整数列表提供给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
答案 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
它列出了与以下类型的自动兼容性:
请记住,尽管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