簡介
require函數(shù)像dofile一樣載入文件為一個Chunk并執(zhí)行。但具有兩個好處:1. 按模式加載文件 2.不會重復(fù)載入相同的文件
require和package.path的關(guān)系
典型的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的關(guān)系
如果沒有載入任何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函數(shù)的偽代碼
# 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??????????<== 可以手工設(shè)置
package.loaded[virname] = false來重復(fù)載入該文件
# ????? 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;有些區(qū)別;前者最后匹配 ";..\\?.lua",后者首先匹配 ";..\\?.lua"; 至于那種方式好那就看各位的愛好了
require函數(shù)像dofile一樣載入文件為一個Chunk并執(zhí)行。但具有兩個好處:1. 按模式加載文件 2.不會重復(fù)載入相同的文件
require和package.path的關(guān)系
典型的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的關(guān)系
如果沒有載入任何Chunk,典型的package.loaded是類似如下的一張表
string?
package?
_G?
os?
table?
math?
coroutine table: 003738A8
debug?
io?
當我們require("main")成功后,該表會變回
string?
package?
_G?
os?
table?
math?
coroutine table: 003738B0
debug?
io?
main?
require函數(shù)的偽代碼
# function require(virname) do
# ?
#?
#?
#
#?
#?
# ?
# ?
#
# if not anyfileloaded then
# ?
# 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;有些區(qū)別;前者最后匹配 ";..\\?.lua",后者首先匹配 ";..\\?.lua"; 至于那種方式好那就看各位的愛好了