lua 重新加载模块

重新加载模块
[c-sharp]  view plain copy print ?
  1. function reload( moduleName )  
  2.     package.loaded[moduleName] = nil  
  3.     require(moduleName)  
  4. end  

 

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

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

 

 


原代码

模块A:

[c-sharp]  view plain copy print ?
  1. A = {}  
  2. function A.test1()  
  3.     print(1)  
  4.     A.test2()  
  5. end  
  6. functin A.test2()  
  7.     print(2)  
  8. end  

 

模块Main:

[c-sharp]  view plain copy print ?
  1. Main=  
  2. {  
  3.     callBack = nil,  
  4. }  
  5. function Main.setCallBack()  
  6.     Main.callBack = A.test1  
  7. end  
  8. function Main.call()  
  9.     Main.callBack()  
  10. end  
  11. Main.setCallBack()  

 

 

调用Main.call()输出:

1

2

 

 

修改代码后

如果修改A为:

模块A:

[c-sharp]  view plain copy print ?
  1. A = {}  
  2. function A.test1()  
  3.     print(1)  
  4.     print(3)  
  5.     A.test2()  
  6. end  
  7. functin A.test2()  
  8.     print(2)  
  9.     print(4)  
  10. end  

 

然后通过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代码可以即时生效。

[c-sharp]  view plain copy print ?
  1. function Debug.exec(str, acc)  
  2.     if not isDebug() then  
  3.         return false  
  4.     end  
  5.     local c = CharactorManager.getObjByAccName( acc )  
  6.     if c == nil then return end  
  7.     str = "local c = CharactorManager.getObjByAccName(/"" .. acc .."/")" .. str  
  8.     print1(str)  
  9.     local func = loadstring( str )  
  10.     if func then      
  11.         func(c)   
  12.         print1("Suc")  
  13.     else          
  14.         print1("Fail")  
  15.     end  
  16. end  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值