lua --- Module


首先需要明白,一般情況下,我們的定義的lua模塊的文件與模塊名(其實就是table的名字)是一致的,當然,不一致代碼也是可以編譯的(親測),之所以這樣,本人認為是為了實際項目中管理的方便。以下是定義模塊的集中方式(文件名字是 GameMudle.lua):

方式一:

 1 GameModule = {};
 2 
 3 function GameModule.ShowName()
 4     print("fun : ShowName");
 5 end
 6 
 7 function GameModule.ShowInfo()
 8     print("fun : ShowInfo");
 9 end
10 
11 return GameModule;

假如有一天,我們想要修改模塊的名字了,就需要逐行代碼的去修改對應的模塊名字,顯然,這實際非常不合理的。

以下是調整過的一種定義方式:

 1 GameModule = {};
 2 
 3 local this = GameModule;
 4 
 5 function this..ShowName()
 6     print("fun : ShowName");
 7 end
 8 
 9 function this.ShowInfo()
10     print("fun : ShowInfo");
11 end
12 
13 return this;

這樣的話,每次修改模塊的名字,我們只需要去修改第一行和第三行就可以了。但是還有一個問題,就是開始提到的,為了工程管理的方便,模塊所在的lua文件名字與模塊名需要保持一致,這樣的話,我們沒次更改模塊名字,

需要同時修改模塊名和模塊所在的lua文件名,思考一下還有更好的定義模塊的方式嗎?顯然是有的(哈哈哈。。。)。

以下是另外一種定義模塊的方式:

 1 local this = {};
 2 
 3 local moduleName = ...;   --傳遞模塊名,可以理解為文件名
 4 _G[moduleName] = this;    --將全局環境設置為 this   
 5 
 6 function this.ShowName()
 7     print("fun : ShowName");
 8 end
 9 
10 function this.ShowInfo()
11     print("fun : ShowInfo");
12 end
13 
14 return this;

進一步簡化:

 1 local this = {};
 2 
 3 local moduleName = ...;               --傳遞模塊名,可以理解為文件名
 4 _G[moduleName] = this;                --將全局環境設置為 this,環境其實可以理解為一個表 
 5 setmetatable(this,{__index = _G})      --沒有這一句,全局的 print 等內置函數將不能使用
 6 setfenv(1, this)                      --創建一個非全局環境 ,防止在全局環境中方法等命名的沖突,這里改變的是運行環境
 7 
 8 --全局環境設置為 this ,於是,我們直接定義函數的時候,不需要再帶 this 前綴。
 9 --因為此時的全局環境就是M,不帶前綴去定義變量,就是全局變量,這時的全局變量是保存在 this 里。 
10 function ShowName()
11     print("fun : ShowName");
12 end
13 
14 function ShowInfo()
15     print("fun : ShowInfo");
16 end
利用 module 函數進一步簡化模塊的定義:
1 module(..., package.seeall);
2 function ShowName()
3     print("fun : ShowName");
4 end
5 
6 function ShowInfo()
7     print("fun : ShowInfo");
8 end

調用方式:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM