Lua中require,dofile,loadfile,dostring,loadstring,loadlib,load之間的區別
Lua 是一種解釋型語言,可以執行動態生成代碼,正是因為存在dofile這樣的函數;然而dofile 只是一個輔助函數,loadFile 才做了核心工作。LoadFile 會加載一段代碼,只編譯不執行,並把結果作為一個函數返回,可以多次調用;然而dofile是加載並執行,會造成多次開銷,LoadFile 由於只編譯一次,所以 開銷卻很少。
說完了LoadFile 和DoFile 後,我們來談一下 require ;require這個函數有意思了。我們require 通常是一個模塊,比如Lua 文件或者C文件,並作為一個table 返回。下面我們來具體分析一些 require 都做了些什麽。
先上一段代碼:
function require(name)
if not package.loaded[name] then
local loader = findloader(name)
if loader == nil then
error("沒找到 模塊")
end
package.loaded[name] = true;
local res = loader(name)
if res ~= nil then
package.loaded[name] = res;
end
end
return package.loaded[name]
end
上完代碼後,我不過多解釋,大概都可以看明白吧。
package.loaded 中檢查是否已加載,如果沒有就創建加載器,如果有就直接返回,
如果要強制require 某個模塊2次的話,需要將package.laoded[name] = nil;
require 進來後,並不執行。如果require 的是C文件,就需要package.loadlib 去加載。
說一些loadstring :loadstring 用法和loadfile類似,但是性能開銷很大,loadstring 是加載字符串,並把函數作為一個值返回 比如:
f = loadstring("i = i + 1")
f();
如果有出錯 就用 assert(f)() 輸出log;
每次調用loadstring都會被編譯,而且是全局編譯
i = 32;
local i = 0;
f = loadstring("i = i+1; print(1)");
g = function() i = i+1;print(i) end
f(); ---->33
g(); -->1
loadfile 和loadstring 其實都是調用lua中原始函數load,load 加載程序塊可以分多次返回一個程序塊,知道返回nil為止,或者程序塊過大無法放入內存中才用到它
Lua中require,dofile,loadfile,dostring,loadstring,loadlib,load之間的區別