關于Lua Module機制分析
關于Lua Module機制分析是本文要介紹的內容,主要是來了解并學習Lua Module機制,具體內容來看本文詳解。Lua中的模塊(module)機制有點類似于C語言的動態庫,可以將一些公共的代碼放在模塊中,以API的形式提供給Lua應用腳本使用。使用模塊或許還可以做成像Android的Application Frameworks,建立一種新的應用程序編程模型,只是猜想。
模塊最簡單的使用方式:
- view plaincopy to clipboardprint?require “os”
- os.clock()
- require “os”
- os.clock()
table
Lua語言共有8中數據類型,其中table(表)類型實現了“關聯數組(associative array)”。table中可以保存各種數據類型。和table關聯的metatable,它定義了表的操作的一些行為,比如: 使用+操作時,會去查找metatable的屬性__add,有的話執行。
function
function是Lua中8中基本類型之一,和其它類型一樣可以作為值傳遞。和function有關聯的表是環境表(environment),可以認為是function的執行環境。可以通過setfenv()和getfenv()來設置和獲取函數的環境表。函數中對于全局的操作,比如:定義全局變量等;就是在這個表中進行的。多個函數可以共享一個表
require
當使用require加載一個模塊時,實際上做了如下的事情:
在表package.loaded中查找模塊是否存在,有的話就返回該值。可以使用如下函數輸出表中的內容
- 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中的內容如下,其中包含了一些默認加載的庫和全局表_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函數。loadfile會將文件當作函數來加載,require會將模塊名作為參數傳給該函數。若有返回值則將返回值放入表package.loaded中。若沒有則返回表package.loaded中的值。
module
當在模塊文件中使用module函數的時候,如下所示;
- view plaincopy to clipboardprint?module “mymodule”
- module “mymodule”
實際上等同于以下的語句:
- view plaincopy to clipboardprint?local modname = “mymodule” – 定義模塊名
- local M = {} -- 定義用于返回的模塊表
- _G[modname] = M -- 將模塊表加入到全局變量中
- package.loaded[modname] = M -- 將模塊表加入到package.loaded中,防止多次加載
- setfenv(1,M) -- 將模塊表設置為函數的環境表,這使得模塊中的所有操作是以在模塊表中的,這樣定義函數就直接定義在模塊表中
- local modname = “mymodule” – 定義模塊名
- local M = {} -- 定義用于返回的模塊表
- _G[modname] = M -- 將模塊表加入到全局變量中
- package.loaded[modname] = M -- 將模塊表加入到package.loaded中,防止多次加載
- setfenv(1,M) -- 將模塊表設置為函數的環境表,這使得模塊中的所有操作是以在模塊表中的,這樣定義函數就直接定義在模塊表中
通過module(),可以方便的編寫模塊中的內容。
測試環境
- lua for windows IDE
小結:關于Lua Module機制分析的內容介紹完了,希望通過本文的學習能對你有所幫助!