虽然我正在使用的程序是用Java编写的,但是从C角度来回答这个问题也很好,因为大部分内容都与语言无关,或者在Lua方面发生。
在我正在编程的游戏体系结构的概要中,从数据文件中加载特定类中的各种类型的游戏对象(例如:生物,物品,咒语等)。它们的大多数属性都是简单的数据类型,但我希望其中一些成员实际上包含简单的脚本,这些脚本定义了一个项目在使用时的功能。脚本将非常简单,因为所有基本的游戏操作都将通过Java的API公开。 Lua只负责将几个基本函数串联起来并设置参数。
问题主要是关于将特定Lua函数的引用存储为Java类的成员的最佳方法。
据我所知,如果我将Lua代码存储为字符串并调用lua_dostring,Lua将在每次调用时编译代码。因此需要以某种方式定义函数,并在Java函数对象中包含对此特定函数的引用。
我考虑过的一种可能性是,在数据加载过程中,当加载器遇到数据文件中的脚本定义时,它会提取此字符串,使用关联对象的唯一ID修饰函数名称,调用lua_dostring包含完整函数定义的字符串,然后将生成的函数名称包装在Java函数对象中。在使用lua_dostring运行的脚本中声明的函数仍应添加到全局函数表中,对吗?
我只是想知道是否有更好的方法来解决这个问题。我承认我在这一点上对Lua的了解是相当肤浅的和理论上的,所以我可能忽略了一些明显的东西。
答案 0 :(得分:2)
只需k = luaL_ref(L, LUA_REGISTRYINDEX);
。
使用要在堆栈顶部引用的Lua值调用它,它将返回一个整数k
。存储此整数,当您需要Lua值时,只需执行lua_rawget(L, LUA_REGISTRYINDEX, k);
将值再次推送到堆栈顶部。如果要释放对象(即在对象销毁时),请调用luaL_unref(L, k)
它适用于任何类型的Lua值,包括函数(或事实上的闭包)和协同程序。