Compilation, Execution, and Errors
前面我們介紹過dofile函數, 其實dofile的實現如下:
function dofile (filename)
local f = assert(loadfile(filename))
return f()
end
loadfile函數很靈活, 我們可以多次調用loadfile的返回結果來反復執行一段代碼. 但是如果出錯loadfile將返回nil和一個錯誤提示信息.
loadstring功能和loadfile類似, 參數為要直接處理的script內容.
f = loadstring("i = i + 1")
i = 0
f(); print(i) --> 1
f(); print(i) --> 2
loadstring載入后相當于多了一個匿名函數定義,
-- file `foo.lua'
function foo (x)
print(x)
end
f = loadfile("foo.lua")
f() -- defines `foo'
foo("ok") --> ok
你也可以使用loadstring(s)()達到同樣的效果.
使用loadstring時所用的變量都位于全局空間:
local i = 0
f = loadstring("i = i + 1") -- global i
g = function () i = i + 1 end --local i
The require Function
Lua提供了一個函數require用來載入庫. require作的工作有些像dofile但有兩點重要不同:require會在path指定的路徑搜索文件, 而且require可以知道一個文件是否已被執行, 如果已被執行過, 那么不會再次被執行.
Lua使用的path和許多平臺使用的標準path有些不同, 許多平臺使用的path是一系列含有目標文件的文件夾,但是Lua不一樣. Lua使用的ANSI C語言并沒有path這樣的概念, 因此Lua使用的是字符串匹配的方式. '?'代表文件名, 以';'隔開.
?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua
如果調用 require 'lili', 那么會嘗試打開下列文件:
lili
lili.lua
c:\windows\lili
/usr/local/lua/lili/lili.lua
require會首先檢查全局變量LUA_PATH, 如果LUA_PATH是一個字符串類型, 那么使用它的值. 否則檢查環境變量LUA_PATH, 如果以上值都不存在, 那么使用一個定值, 這個值可以在編譯LUA的時候方便的加以改變.
另一個require的主要功能是避免一個文件被執行多次. 為了實現這個目的, 它保存了一個table用來記錄所有已經載入的文件. 注意, 這里的key值并不是真實的文件名而是一個虛擬文件名. 所以
require "foo"
require "foo.lua"
path是"?;?.lua", 那么foo.lua會被載入兩次. 可以通過全局變量 _LOADED 訪問到這個表的值.
path中可以含有固定文件的值, 例如:
?;?.lua;/usr/local/default.lua
在這種情況下, 如果 reqire 不能找到其他的匹配, 那么就使用/usr/local/default.lua.
文章來源于領測軟件測試網 http://www.kjueaiud.com/