Posted on 2010-06-20 12:53
S.l.e!ep.¢% 閱讀(1538)
評論(0) 編輯 收藏 引用 所屬分類:
Lua
簡介
require函數像dofile一樣載入文件為一個Chunk并執行。但具有兩個好處:1. 按模式加載文件 2.不會重復載入相同的文件
require和package.path的關系
典型的package.path值如下(其中D:\Bin為lua.exe所在目錄):
.\?.lua;D:\Bin\lua\?.lua;D:\Bin\lua\?\init.lua;D:\Bin\?.lua;D:\Bin\?\init.lua
通常對我們有用的目錄是.\?.lua
例如require("test")將載入.\test.lua
require和package.loaded的關系
如果沒有載入任何Chunk,典型的package.loaded是類似如下的一張表
string??? table: 00375D48
package?? table: 00373C30
_G??????? table: 00371FD8
os??????? table: 00375628
table???? table: 00373198
math????? table: 003763C8
coroutine table: 003738A8
debug???? table: 00376FA0
io??????? table: 00374DC8
當我們require("main")成功后,該表會變回
string??? table: 00375D58
package?? table: 00373C38
_G??????? table: 00371FC0
os??????? table: 00375638
table???? table: 003731A0
math????? table: 003763D8
coroutine table: 003738B0
debug???? table: 00376FB0
io??????? table: 00374DD8
main????? true???????????? <== 新增表項
package.loaded["main"] = true
require函數的偽代碼
# function require(virname) do
#
?? if not package.loaded[virname] then
#???? return
#?? end
#
#??
local anyfileloaded = false
#??
patternpath = (replace '?' in package.path to virname)
#??
foreach path in patternpath split by ';' do <== virname如果含有'.', 那么'.'會被替換為'\\'
#
??? if ((chunk = loadfile(path)) ~= nil) then
#
????? chunk()
#
????? package.loaded[virname] = true??????????<== 可以手工設置
package.loaded[virname] = false來重復載入該文件
#
????? anyfileloaded = true
#
????? break
#
??? end
#??
end
#
#
if not anyfileloaded then
#
??? print error message
#??
end
#
end
載入父目錄文件
值得注意的是當前目錄下的子目錄可以用require("subdir\\subdirfile")的方式載入,而父目錄卻不可以用 require("..\\pardirfile")的方式載入。
原因是subdir\subdirfile被替換為.\subdir\subdirfile.lua;...
而..\pardirfile被替換為.\\\\pardirfile.lua;...
我們可以通過如下方式載入父目錄文件
package.path = package.path ..
";..\\?.lua"
require(pardirfile)
注意這里
package.path = package.path ..
";..\\?.lua"和
package.path =
"..\\?.lua;" ..
package.path;有些區別;前者最后匹配
";..\\?.lua",后者首先匹配
";..\\?.lua"; 至于那種方式好那就看各位的愛好了