加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua动态加载模块

发布时间:2020-12-14 22:22:16 所属栏目:大数据 来源:网络整理
导读:重新加载模块 function reload( moduleName ) package.loaded[moduleName] = nil require(moduleName)end ? 使用以上代码即可重新载入一个文件。 这样修改完lua代码后,可以不用重启程序立刻生效。 ? ? 原代码 模块A: A = {}function A.test1() print(1) A.

重新加载模块

?

使用以上代码即可重新载入一个文件。

这样修改完lua代码后,可以不用重启程序立刻生效。

?

?


原代码

模块A:

?

模块Main:

?

?

调用Main.call()输出:

1

2

?

?

修改代码后

如果修改A为:

模块A:

?

然后通过RPC或其他方法调用reload("A"),然后再调用Main.call()输出:

1

2

4

?

可以看到3没有输出。

也就是说 Main.callBack = A.test1 记录的是老的A.test1,重新载入后调用的还是老的A.test1。所以没有输出3。

但是老的A.test1调用的A.test2,是直接调用而不是记录的函数变量,动态得在全局查询函数名时查到的是新的A.test2了。所以输出了4。

?

在重新载入一个模块后,要注意其他地方有没有保存本模块的函数变量。

一般来说有RPC call函数名到函数的映射,还有timer等,这些callback都是记录函数变量的。

?

?

?

?

RPC调用

下面一个远程客户端输入脚本,传到服务端由服务端的lua虚拟机执行的代码,主要是利用loadstring函数。

str参数就是输入的脚本,acc为当前session的唯一标志,这里是账号名。

可以预先准备一些当前session固定的常用的变量,比如这里c对应的就是玩家。客户端在写脚本的时候可以直接使用这些变量。

在改变了某个模块A的代码后,可以结合上面的reload(),在客户端输入 reload("a"),rpc调用服务端的Debug.exec,更改的lua代码可以即时生效。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读