1. 程式人生 > >lua 重新載入模組

lua 重新載入模組

重新載入模組

[c-sharp] view plaincopyprint?
  1. function reload( moduleName )  
  2.     package.loaded[moduleName] = nil  
  3.     require(moduleName)  
  4. end  

使用以上程式碼即可重新載入一個檔案。

這樣修改完lua程式碼後,可以不用重啟程式立刻生效。

原始碼

模組A:

[c-sharp] view plaincopyprint?
  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 plaincopyprint?
  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 plaincopyprint?
  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 plaincopyprint?
  1. function Debug.exec(str, acc)  
  2.     if not isDebug() then  
  3.         returnfalse
  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  

相關推薦

lua 重新載入模組

重新載入模組 [c-sharp] view plaincopyprint? function reload( moduleName )       package.loaded[moduleName] = nil       require(moduleNa

Python 3.X重新載入模組

為防止兩個模組互相匯入的問題,Python預設所有的模組都只匯入一次,如果需要重新匯入模組, Python2.7可以直接用reload(),Python3.X可以用下面幾種方法: 方法一:基本方法

Python重新載入模組方法

importlib 模組的作用模組,是一個一個單獨的py檔案 包,裡面包含多個模組(py檔案)動態匯入模組,這樣就不用寫那麼多的import程式碼, 典型的例子: 自動同步服務,每個網站都有一個py檔案。主程序裡收到同步任務,根據名稱來動態匯入對應的py檔案,這樣就不用寫那麼

lua 重新載入module

require 時候會檢查filename是否已經載入過,如果載入過那麼就記錄在 package.loaded表中,package.loaded[filename]=true 不會繼續讀檔案。此時如果想重新載入檔案,那麼將package.loaded[filename]=n

Python 重新載入模組

簡述 在進行模組化程式設計時,經常會遇到這樣一種場景: 編寫了一個 Python 模組,並用 import my_module 的形式進行匯入。當對該模組進行更改後,即使重新匯入,其中的任何改變都不會被識別,這使得模組除錯變得非常困難。 那麼,該如

Lua重新載入Lua檔案

function CFModuleReload( moduleName) if UtilityHelper:getInnerTest() == 1 then CCFileUt

lua檔案的載入和解除安裝~package.loaded和require配合讓一個檔案更新後重新載入

用require函式只能載入一次,因為它的特性是: 1、require函式會搜尋目錄載入檔案 2、require會判斷是否檔案已經載入避免重複載入同一檔案 而這個特性二,雖然我們可能知道這兩個特性,但是潛意識裡面常常把這個特性二給忽視掉了. 直到哪天我們需要反覆載入同

叢集環境下module載入模組與作業提交

叢集上已安裝了軟體,卻無法呼叫,許可權不足的情況下,往往管理賬戶會開放一個埠,讓我能夠只用module命令來載入相關軟體。 module使用 管理賬戶modules的安裝 sudo yum install -y environment-modules mo

0day 第11章--11.6節:利用載入模組之外的地址繞過SafeSEH

實驗環境:winxp sp3 vs2010 總結一下入的坑: (1) 變數zero的位置必須在strcpy()的後面,不然strcpy之後會將zero的值覆蓋掉,導致zero不為0,觸發不了異常。 void test(char * input) { char str[200];

Spyder 自動補全 載入模組

1.刪除環境中的enum包,pip uninstall enum     或 pip uninstall enum34 2.找到 module_completion.py 檔案,位於目錄usr/lib/dist-packages/spyderlib/u

ionic-infinite在隱藏後,重新整理頁面重新載入資料,無法下拉載入的問題

問題描述: /** * doInfinite上拉載入 */ doInfinite(infinite) { this.index++; this.infinite=infinite

核心載入模組時出現Unknown symbol等提示

一.背景 1.更改了核心的配置,重新編譯了核心 2.未重新編譯核心模組 3.板子上只更新了核心,並未更新檔案系統   二.分析 發現是在讀取/etc/module.d/中的內容時出現Unknown symbol等資訊,恰逢當時只更新了核心未更新根檔案系統,因此懷疑與根檔案系統有關. &

Python 動態載入模組

lib資料夾下有test.py檔案: test.py檔案內容如下: class simple(object): def __init__(self): self.name='剛田武'  在‘動態載入模組.py’檔案下動態載入test.py模組的方法如下:

微信中蘋果h5頁面用window.history.go(-1)返回上一頁頁面不會重新載入/重新整理

微信中h5頁面用window.history.go(-1)返回上一頁頁面不會重新載入問題 問題描述:     在實際開發中遇到這樣一個問題,業務需求涉及到返回上一頁問題,第一時間想到了window.history.go(-1)方法,這樣做本身沒有任何問題,但是在微信中,安卓手機還好返回上一頁

Nginx下修改php.ini後重新載入配置檔案命令 Nginx下修改php.ini後重新載入配置檔案命令

Nginx下修改php.ini後重新載入配置檔案命令   修改php.ini後 如,我的 php.ini 檔案是放在 /etc/php.ini php 所在目錄是 /www/Linux/php-5.2.17 修改 php.ini 後要用 php-f

android螢幕旋轉禁止activity重新載入

android螢幕旋轉時預設會重新載入頁面,使用者體驗較差。 如果要禁止重新載入可以用如下方法: AndroidManifest.xml中對應的activity下增加一項 android:configChanges="orientation|screenSize" <act

.net載入失敗的程式集重新載入

在.net程式中,程式集是Lazy載入的,只有在用的時候才會去載入,當程式集載入失敗時,會觸發AppDomain.AssemblyResolve的事件,在這個事件中,我們甚至還可以進行補救,從別得地方重新載入程式集。 AppDomain.CurrentDomain.AssemblyResolve 

如何在不重啟 JVM 的情況下重新載入證書檔案?

某種情況下需要動態下載證書檔案後使用 SSL 訪問某服務,但由於 JVM 使用預設的證書訪問新服務,該證書在 JVM 啟動的時候載入,那時還沒有新服務的證書,所以會報 ValidatorException,詳情: 16:44:27,338 ERROR [Htt

Angular ui-roter 和AngularJS 通過 ocLazyLoad 實現動態(懶)載入模組和依賴

什麼是ui-router   ui-router是AngularUI庫最有用的元件之一(AngularUI庫由AngularJS社群構建)。它是一個第三方路由框架,允許通過狀態機制組織介面,而不是簡單的URL路由。   什麼是ocLoayLoad   ocLoayLoad是AngularJS

eclipse 重新載入專案遇到的問題----The entity has no primary key attribute defined

原文地址::https://blog.csdn.net/baidu_26550817/article/details/51752085 相關文章 1、JPA Error : The entity has no primary key attribute defined----https://