我听说互联网上有关于能够在Lua中热插拔代码的麻烦,类似于在
Java,Erlang,Lisp等中完成的代码.但是,30分钟的谷歌搜索没有发现任何东西.有没有人读过这方面的实质内容?有没有经验呢?它在LuaJIT中工作还是仅在参考VM中工作?
作为实时环境中的升级路径,我对开发/调试中的快捷方式更感兴趣.
解决方法
Lua和大多数脚本语言都不支持定义它时最常用的“热交换”形式.也就是说,您无法保证更改磁盘上的文件并对其进行任何更改将其自身传播到正在执行的程序中.
但是,Lua和大多数脚本语言完全能够控制热交换形式.全球职能是全球职能.模块只是加载全局函数(如果你以这种方式使用它们).因此,如果模块加载全局函数,则可以在模块更改时再次重新加载模块,并且这些全局函数引用将更改为新加载的函数.
但是,Lua和大多数脚本语言都不能保证这一点.所发生的一切都是全球状态数据的变化.如果有人将旧函数复制到局部变量中,他们仍然可以访问它.如果模块使用本地状态数据,则新版本的模块无法访问旧模块的状态.如果模块创建某种具有成员函数的对象,除非从全局变量中获取这些成员,否则这些对象将始终引用旧函数,而不是新函数.等等.
此外,Lua不是线程安全的;您不能在某个时刻中断lua_State并尝试再次加载模块.因此,您必须设置一些特定的时间点,以便检查输出并重新加载已更改的文件.
所以你可以做到这一点,但从它可能发生的意义上说,它不是“支持”的.你必须为它工作,你必须要小心你如何写东西以及你在本地和全局函数中放置什么.