有没有一种简单的方法可以将 lua table 转换为 C++ 数组或向量?
Is there a simple way to convert a lua table to a C++ array or vector?
我开始制作自己的包管理器,并开始开发依赖系统。
构建文件是用 lua 编写的,它们看起来像这样:
package = {
name = "pfetch",
version = "0.6.0",
source = "https://github.com/dylanaraps/pfetch/archive/0.6.0.tar.gz",
git = false
}
dependencies = {
"some_dep",
"some_dep2"
}
function install()
quantum_install("pfetch", false)
end
唯一的问题,我不知道如何转换
dependencies = {
"some_dep",
"some_dep2"
}
到全局 c++ 数组:["some_dep", "some_dep2"]
列表中任何无效的字符串都应该被忽略。
有什么好办法吗?
提前致谢
注意:我正在使用 C api 与 C++ 中的 lua 交互。我不知道 Lua 的错误是使用 longjmp
还是 C++ 异常。
根据您在评论中的说明,以下内容对您有用:
#include <iostream>
#include <string>
#include <vector>
#include <lua5.3/lua.hpp>
std::vector<std::string> dependencies;
static int q64795651_set_dependencies(lua_State *L) {
dependencies.clear();
lua_settop(L, 1);
for(lua_Integer i = 1; lua_geti(L, 1, i) != LUA_TNIL; ++i) {
size_t len;
const char *str = lua_tolstring(L, 2, &len);
if(str) {
dependencies.push_back(std::string{str, len});
}
lua_settop(L, 1);
}
return 0;
}
static int q64795651_print_dependencies(lua_State *) {
for(const auto &dep : dependencies) {
std::cout << dep << std::endl;
}
return 0;
}
static const luaL_Reg q64795651lib[] = {
{"set_dependencies", q64795651_set_dependencies},
{"print_dependencies", q64795651_print_dependencies},
{nullptr, nullptr}
};
extern "C"
int luaopen_q64795651(lua_State *L) {
luaL_newlib(L, q64795651lib);
return 1;
}
演示:
$ g++ -fPIC -shared q64795651.cpp -o q64795651.so
$ lua5.3
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio
> q64795651 = require('q64795651')
> dependencies = {
>> "some_dep",
>> "some_dep2"
>> }
> q64795651.set_dependencies(dependencies)
> q64795651.print_dependencies()
some_dep
some_dep2
>
一个重要的陷阱:由于您不确定 Lua 是否被编译为使用 longjmp
或其错误的异常,因此您需要确保没有任何自动变量在任何可能发生 Lua 错误的地方使用析构函数。 (我的回答中的代码已经是这种情况;只要确保在将其合并到您的程序中时不会意外添加任何此类位置即可。)
我开始制作自己的包管理器,并开始开发依赖系统。 构建文件是用 lua 编写的,它们看起来像这样:
package = {
name = "pfetch",
version = "0.6.0",
source = "https://github.com/dylanaraps/pfetch/archive/0.6.0.tar.gz",
git = false
}
dependencies = {
"some_dep",
"some_dep2"
}
function install()
quantum_install("pfetch", false)
end
唯一的问题,我不知道如何转换
dependencies = {
"some_dep",
"some_dep2"
}
到全局 c++ 数组:["some_dep", "some_dep2"]
列表中任何无效的字符串都应该被忽略。
有什么好办法吗?
提前致谢
注意:我正在使用 C api 与 C++ 中的 lua 交互。我不知道 Lua 的错误是使用 longjmp
还是 C++ 异常。
根据您在评论中的说明,以下内容对您有用:
#include <iostream>
#include <string>
#include <vector>
#include <lua5.3/lua.hpp>
std::vector<std::string> dependencies;
static int q64795651_set_dependencies(lua_State *L) {
dependencies.clear();
lua_settop(L, 1);
for(lua_Integer i = 1; lua_geti(L, 1, i) != LUA_TNIL; ++i) {
size_t len;
const char *str = lua_tolstring(L, 2, &len);
if(str) {
dependencies.push_back(std::string{str, len});
}
lua_settop(L, 1);
}
return 0;
}
static int q64795651_print_dependencies(lua_State *) {
for(const auto &dep : dependencies) {
std::cout << dep << std::endl;
}
return 0;
}
static const luaL_Reg q64795651lib[] = {
{"set_dependencies", q64795651_set_dependencies},
{"print_dependencies", q64795651_print_dependencies},
{nullptr, nullptr}
};
extern "C"
int luaopen_q64795651(lua_State *L) {
luaL_newlib(L, q64795651lib);
return 1;
}
演示:
$ g++ -fPIC -shared q64795651.cpp -o q64795651.so
$ lua5.3
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio
> q64795651 = require('q64795651')
> dependencies = {
>> "some_dep",
>> "some_dep2"
>> }
> q64795651.set_dependencies(dependencies)
> q64795651.print_dependencies()
some_dep
some_dep2
>
一个重要的陷阱:由于您不确定 Lua 是否被编译为使用 longjmp
或其错误的异常,因此您需要确保没有任何自动变量在任何可能发生 Lua 错误的地方使用析构函数。 (我的回答中的代码已经是这种情况;只要确保在将其合并到您的程序中时不会意外添加任何此类位置即可。)