LUA教程require函式 30

2021-10-23 08:28:58 字數 2125 閱讀 7710

lua提供高階的require函式來載入執行庫。粗略的說require和dofile完成同樣的功能但有兩點不同:

1. require會搜尋目錄載入檔案

2. require會判斷是否檔案已經載入避免重複載入同一檔案。由於上述特徵,require在lua中是載入庫的更好的函式。

require使用的路徑和普通我們看到的路徑還有些區別,我們一般見到的路徑都是乙個目錄列表。require的路徑是乙個模式列表,每乙個模式指明一種由虛檔名(require的引數)轉成實檔名的方法。更明確地說,每乙個模式是乙個包含可選的問號的檔名。匹配的時候lua會首先將問號用虛檔名替換,然後看是否有這樣的檔案存在。如果不存在繼續用同樣的方法用第二個模式匹配。例如,路徑如下:

?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua
呼叫require "lili"時會試著開啟這些檔案:

lili

lili.lua

c:\windows\lili

/usr/local/lua/lili/lili.lua

require關注的問題只有分號(模式之間的分隔符)和問號,其他的資訊(目錄分隔符,副檔名)在路徑中定義。

為了確定路徑,lua首先檢查全域性變數lua_path是否為乙個字串,如果是則認為這個串就是路徑;否則require檢查環境變數lua_path的值,如果兩個都失敗require使用固定的路徑(典型的"?;?.lua")

require的另乙個功能是避免重複載入同乙個檔案兩次。

lua保留一張所有已經載入的檔案的列表(使用table儲存)。如果乙個載入的檔案在表中存在require簡單的返回;表中保留載入的檔案的虛名,而不是實檔名。所以如果你使用不同的虛檔名require同乙個檔案兩次,將會載入兩次該檔案。比如require "foo"和require "foo.lua",路徑為"?;?.lua"將會載入foo.lua兩次。我們也可以通過全域性變數_loaded訪問檔名列表,這樣我們就可以判斷檔案是否被載入過;同樣我們也可以使用一點小技巧讓require載入乙個檔案兩次。比如,require "foo"之後_loaded["foo"]將不為nil,我們可以將其賦值為nil,require "foo.lua"將會再次載入該檔案。

乙個路徑中的模式也可以不包含問號而只是乙個固定的路徑,比如:

?;?.lua;/usr/local/default.lua
這種情況下,require沒有匹配的時候就會使用這個固定的檔案(當然這個固定的路徑必須放在模式列表的最後才有意義)。在require執行乙個chunk以前,它定義了乙個全域性變數_requiredname用來儲存被required的虛檔案的檔名。我們可以通過使用這個技巧擴充套件require的功能。舉個極端的例子,我們可以把路徑設為"/usr/local/lua/newrequire.lua",這樣以後每次呼叫require都會執行newrequire.lua,這種情況下可以通過使用_requiredname的值去實際載入required的檔案。

我們知道乙個lua檔案是作為乙個**塊(chunk)存在的,其實質就是乙個函式,那麼最簡單的,我在乙個外部lua檔案中寫一段**,然後在主lua檔案中用dofile呼叫,外部檔案的**塊就會執行了。

形式上很類似c語言的#include<...>,在其他地方定義的函式,經這麼引入檔案之後就可以呼叫了。不過lua並不是定義和實現分離的語言,這樣是把整個定義部分都載入進來了。載入過程大致上是: lua先載入這個外部檔案,然後執行它。實際上這段外部**是可以有返回值的,它的返回值就是require的返回值。這裡我們什麼返回值都沒有,執行這個外部**的結果就是定義了這麼個全域性函式。注意是全域性函式,雖然通常我們直接定義的函式 都是全域性函式所以都沒怎麼注意過,要是非要定義個區域性函式在主程式塊裡可就看不到了。

可以在外部檔案裡定義一堆函式,然後全都加到全域性環境下。不過全域性的東西用起來要小心,有乙個原則是對全域性的「汙染」越小越好。那麼自然就引入了「模組」 的概念。在lua中,模組由萬能的table來充當。最自然的想法就是定義乙個table,然後把要定義的函式放在這個table裡,最後返回這個 table就行了。

原文:lua乙個小巧指令碼語言學習筆記

lua教程require函式-30

lua中的require函式

lua提供高階的require函式來載入執行庫,lua中的require函式功能主要有 1 require函式會搜尋目錄載入檔案 2 require會判斷是否檔案已經載入避免重複載入同一檔案。由於上述特徵,require在lua中是載入庫的更好的函式。require使用的路徑和普通我們看到的路徑還有...

lua 指定require路徑

在自己的lua檔案中,如果使用到了自己寫的c庫或者第三方庫,想讓lua編譯到自己指定的目錄下尋找.lua或。so檔案的時候,可以再自己的lua 中新增如下 可以指定require搜尋的路徑。package.path usr local share lua 5.1 lua home resty lua...

Lua 改變require函式做到非侵入式更改

遇到這麼個需求,做新版本但不可以改動以前版本的 這個時候就需要用非侵入式寫法。記錄一下從乙個大佬那裡學到的一種非侵入式寫法。下面這是舊版本 gamepanel class gamepanel local m gamepanel function m openpanel print openpanel...