關(guān)于Lua Module機(jī)制分析
關(guān)于Lua Module機(jī)制分析是本文要介紹的內(nèi)容,主要是來了解并學(xué)習(xí)Lua Module機(jī)制,具體內(nèi)容來看本文詳解。Lua中的模塊(module)機(jī)制有點(diǎn)類似于C語言的動態(tài)庫,可以將一些公共的代碼放在模塊中,以API的形式提供給Lua應(yīng)用腳本使用。使用模塊或許還可以做成像Android的Application Frameworks,建立一種新的應(yīng)用程序編程模型,只是猜想。
模塊最簡單的使用方式:
- view plaincopy to clipboardprint?require “os”
- os.clock()
- require “os”
- os.clock()
table
Lua語言共有8中數(shù)據(jù)類型,其中table(表)類型實(shí)現(xiàn)了“關(guān)聯(lián)數(shù)組(associative array)”。table中可以保存各種數(shù)據(jù)類型。和table關(guān)聯(lián)的metatable,它定義了表的操作的一些行為,比如: 使用+操作時,會去查找metatable的屬性__add,有的話執(zhí)行。
function
function是Lua中8中基本類型之一,和其它類型一樣可以作為值傳遞。和function有關(guān)聯(lián)的表是環(huán)境表(environment),可以認(rèn)為是function的執(zhí)行環(huán)境??梢酝ㄟ^setfenv()和getfenv()來設(shè)置和獲取函數(shù)的環(huán)境表。函數(shù)中對于全局的操作,比如:定義全局變量等;就是在這個表中進(jìn)行的。多個函數(shù)可以共享一個表
require
當(dāng)使用require加載一個模塊時,實(shí)際上做了如下的事情:
在表package.loaded中查找模塊是否存在,有的話就返回該值??梢允褂萌缦潞瘮?shù)輸出表中的內(nèi)容
- view plaincopy to clipboardprint?function walkTable(t)
- for k,v in pairs(t) do
- print("+++",k,v,"+++")
- end
- end
- function walkTable(t)
- for k,v in pairs(t) do
- print("+++",k,v,"+++")
- end
- end
package.loaded中的內(nèi)容如下,其中包含了一些默認(rèn)加載的庫和全局表_G
- view plaincopy to clipboardprint?+++ string , table: 003B82B0 +++
- +++ debug , table: 003B9300 +++
- +++ package , table: 003B5C30 +++
- +++ _G , table: 003B2E10 +++
- +++ io , table: 003B7320 +++
- +++ os , table: 003B7988 +++
- +++ table , table: 003B51E0 +++
- +++ math , table: 003B8728 +++
- +++ coroutine , table: 003B59D8 +++
- +++ string , table: 003B82B0 +++
- +++ debug , table: 003B9300 +++
- +++ package , table: 003B5C30 +++
- +++ _G , table: 003B2E10 +++
- +++ io , table: 003B7320 +++
- +++ os , table: 003B7988 +++
- +++ table , table: 003B51E0 +++
- +++ math , table: 003B8728 +++
- +++ coroutine , table: 003B59D8 +++
為模塊查找加載器(loader),查詢package.preload,通常為空
加載Lua文件使用loadfile函數(shù)。loadfile會將文件當(dāng)作函數(shù)來加載,require會將模塊名作為參數(shù)傳給該函數(shù)。若有返回值則將返回值放入表package.loaded中。若沒有則返回表package.loaded中的值。
module
當(dāng)在模塊文件中使用module函數(shù)的時候,如下所示;
- view plaincopy to clipboardprint?module “mymodule”
- module “mymodule”
實(shí)際上等同于以下的語句:
- view plaincopy to clipboardprint?local modname = “mymodule” – 定義模塊名
- local M = {} -- 定義用于返回的模塊表
- _G[modname] = M -- 將模塊表加入到全局變量中
- package.loaded[modname] = M -- 將模塊表加入到package.loaded中,防止多次加載
- setfenv(1,M) -- 將模塊表設(shè)置為函數(shù)的環(huán)境表,這使得模塊中的所有操作是以在模塊表中的,這樣定義函數(shù)就直接定義在模塊表中
- local modname = “mymodule” – 定義模塊名
- local M = {} -- 定義用于返回的模塊表
- _G[modname] = M -- 將模塊表加入到全局變量中
- package.loaded[modname] = M -- 將模塊表加入到package.loaded中,防止多次加載
- setfenv(1,M) -- 將模塊表設(shè)置為函數(shù)的環(huán)境表,這使得模塊中的所有操作是以在模塊表中的,這樣定義函數(shù)就直接定義在模塊表中
通過module(),可以方便的編寫模塊中的內(nèi)容。
測試環(huán)境
- lua for windows IDE
小結(jié):關(guān)于Lua Module機(jī)制分析的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!