Lua標(biāo)準(zhǔn)庫-模塊(Modules)
包庫為Lua提供簡易的加載及創(chuàng)建模塊的方法,由require、module方法及package表組成
1、module (name [, ···])
功能:建立一個(gè)模塊。
當(dāng)package.loaded[name]中存在時(shí),當(dāng)中的表作為module;
當(dāng)在全局表中存在name指定的表時(shí),此表作為module;
當(dāng)以前兩種情況都不存表name時(shí),將新建一個(gè)表,并使其作為全局名name的值,并package.loaded[name],而且設(shè) t._NAME為name,t._M為module,t._PACKAGE為包的全名(模塊名-組件a.b.c);最后把此module設(shè)t作為當(dāng)前函數(shù) 的新環(huán)境表和package.loaded[name]的新值(也就是說,舊的環(huán)境表將不能訪問,除了加上package.seeall參數(shù)外),以被 require使用
module(name)后的可選參數(shù)為接收module名的函數(shù),如package.seeall
2、require (modname)
功能:加載指定的模塊。
此函數(shù)先檢測(cè)package.loaded表中是否存在modname,存在則直接返回當(dāng)中的值,沒有則通過郰定義的加載器加載modname。
查找加載器順序:
(1)檢測(cè)package.preload表是否存在modname,有則加載
(2)通過Lua Loader加載,通過查找存放于package.path的路徑加載,有則加載
(3)通過C Loader加載,通過查找存放于package.cpath的路徑加載,有則加載
(4)通過all-in-one Loader加載:
通過查找modname.dll并查找當(dāng)中的luaopen_
其中XXXX為載塊名-后的字符用_替換.后的字符:如:a.v1-b.c 當(dāng)函數(shù)名為luaopen_b_c
當(dāng)require查找的不是一個(gè)Lua庫或C庫,它就會(huì)調(diào)用all-in-one loader,此加載器是用C路徑作為載塊的目錄,
當(dāng)查找到合適的加載器時(shí),require就會(huì)加載其中的模塊,當(dāng)加載器有返回值,將會(huì)存放于package.loaded[modname]表。最后返回package.loaded[modname]表
當(dāng)加載失敗時(shí),require將觸發(fā)錯(cuò)誤
3、package.cpath
功能:用于require C loader的搜索路徑
可以通過修改LUA_CPATH變量(luaconf.h)修改此值
4、package.loaded
功能:一個(gè)用于讓require知道哪些模塊已加載的記錄表,如果package.loaded已經(jīng)有require要的值,則直接返回此值
5、package.loadlib (libname, funcname)
功能:通過動(dòng)態(tài)連接C函數(shù)庫方式加載Lua擴(kuò)展庫
libname為庫文件名,funcname為入口函數(shù)(此函數(shù)必須為純C接口函數(shù) c++則需用 extern "C" {} 進(jìn)行限制)
6、package.path
功能:用于require Lua loader的搜索路徑
可以通過修改LUA_PATH變量(luaconf.h)修改此值
7、package.preload
功能:一個(gè)用于保存特殊模塊加載器的表
8、package.seeall(module)
功能:為module設(shè)置一個(gè)元表,此元表的__index字段的值為全局環(huán)境_G。所以module可以訪問全局環(huán)境
注:以此函數(shù)作為module()的一個(gè)選項(xiàng)(詳細(xì)見module())
原文鏈接:http://tech.it168.com/j/2008-02-17/200802171009779.shtml