1. 程式人生 > >Lua中require,dofile,loadfile,dostring,loadstring,loadlib,load之間的區別

Lua中require,dofile,loadfile,dostring,loadstring,loadlib,load之間的區別

lib 存在 編譯 執行 return adf 多次調用 過大 UNC

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之間的區別