动态获取 Lua 函数返回值的数量?
2018-6-19 4:29:18
收藏:0
阅读:142
评论:2
我想知道在 C++ 中,是否有可能动态获取 Lua 函数返回值的数量。
例如,我可以像这样在 C++ 中向 Lua 函数传递和返回值:
/* 压入函数和参数 */
lua_getglobal(L, "f"); /* 被调用的函数 */
lua_pushnumber(L, x); /* 压入第一个参数 */
lua_pushnumber(L, y); /* 压入第二个参数 */
/* 调用函数(2个参数,1个返回值) */
if (lua_pcall(L, 2, 1, 0) != 0)
error(L, "运行函数`f`时出错:%s", lua_tostring(L, -1));
/* 对返回值进行处理 */
可以看到,它期望从 Lua 函数返回 1 个值。因此,如果用户在 Lua 函数中返回的值多于(或少于)1 个,则它将无法正常工作。
是否有可能事先检测 Lua 函数返回值的数量,以便我可以在 C++ 中动态处理返回值?
点赞
用户1944004
这是对现有答案的扩展,阐述了一种可能的实现方式。一旦现有答案添加实现示例,我将删除此答案。
#include <iostream>
#include <lua.hpp>
int main(int argc, char *argv[]) {
if (argc != 2) {
std::cerr << "Usage: " << argv[0] << " <script.lua>\n";
return 1;
}
lua_State * L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dofile(L, argv[1]) != 0) {
std::cerr << "lua: " << lua_tostring(L, -1) << '\n';
lua_close(L);
return 1;
}
int stack_size = lua_gettop(L);
lua_getglobal(L, "f");
lua_pushnumber(L, 1);
lua_pushnumber(L, 2);
if (lua_pcall(L, 2, LUA_MULTRET, 0) != 0) {
std::cerr << "lua: " << lua_tostring(L, -1) << '\n';
lua_close(L);
return 1;
}
int num_returns = lua_gettop(L) - stack_size;
std::cout << num_returns << " values returned\n";
lua_close(L);
}
function f(x,y)
return 1,2,3,"Hello World",{},function() end
end
6 values returned
2018-06-19 09:45:09
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

除非 nresults 为 LUA_MULTRET,否则结果个数将调整为 nresults。在此情况下,将推入函数返回的所有结果;Lua 确保返回的值适合栈空间,但不保证栈中有额外的空间。函数结果按直接顺序推入堆栈(首个结果先被推入),因此在调用之后,最后一个结果位于堆栈顶部。
因此,您可以保存以前的堆栈顶部(使用
lua_gettop),减去参数数量和 1 个函数本身,执行调用,然后再次获取堆栈顶部,差异即为返回值数量。记得为 nresults 传递 LUA_MULTRET。