模組require() 使用模組
module() 建立模組
通過require()來載入乙個模組,返回乙個全域性變數table型別。
local a = require 」mod」
foo()
require 函式,搜尋模組名時,使用乙個 』 ; 』 分隔的路徑。我遇到過乙個載入路徑的問題,最後得到的結論是:那一串路徑中一般第乙個:當前路徑,是指執行lua指令碼的當前位置,不是lua指令碼所在的當前路徑。通常,會直接到lua指令碼所在的地方執行,但也有2個路徑有不一樣的時候。eg:/home/example/lua_test/test.lua 這是指令碼所在路徑,執行它時,我可以再/home/example/下面執行,此時test.lua指令碼裡面的require函式查詢的是執行它的路徑下模組檔案。
編寫模組
local modname = ...
local m =
_g[ modname ] = m
package.loaded[modname] = m -- 就替代了本模組最後的return
m.i =
m.f = function ( r , i )
return
end當其他檔案require這個模組的時候會傳遞檔名,那麼檔名就傳遞進來作為引數命名這個模組了。
module函式:編寫模組檔案第一句。它的作用就是上面描述模組檔案的開頭幾句,並且多加一句setfenv( 1 , m)將這個table設定為主程式塊的環境。
module( ... , package.seeall)
package.seeall選項開啟了訪問外部(其他模組或者檔案中的內容)。
記錄一下:使用環境,」函式環境」技術
local modname = ...
local m =
_g[modname] = m
package.loaded[modname] = m
setmetatable( m , ) --繼承外部功能使用eg:io,math
setfenv( 1 , m )
以上就是module函式+package.seeall選項的實現過程
或者想要自己實現這個過程,並限制使用外部模組的一部分:
編寫如下:
--模組設定
local modname = ...
local m =
_g[ modname ] = m
package.loaded[ modname ] = m
--匯入段:宣告本模組想要使用的外部模組功能作為本模組區域性變數
local sqrt = math.sqrt
local io = io
--最後,設定模組的環境
setfenv( 1 , m )
以上子模組:require載入時,用『/』代替『.』
另外,require載入模組時,最後會查詢以引數命名的目錄下的init.lua檔案,來載入翻譯。
eg:/usr/local/lua/?/init.lua
Lua學習筆記之table
零散知識點記錄 table的拷貝是淺拷貝,若要深拷貝a b則需要遍歷b中的元素,並將其一一對應賦值給a。乙個table剛初始化時,是沒有metatable的,必須通過setmetatable給table賦予metatable,table才有metatable。所以若想直接用table 來初始化乙個t...
Lua學習筆記之函式
與主題無關 exp3預設為1 for var exp1 exp2 exp3 do 執行體 end標準庫中提供了幾種迭代器 io.lines 用於迭代檔案中每行 pairs 迭代table中元素 ipairs 迭代 陣列 元素 string.gmatch 迭代字串中單詞多重返回值 x y foo fo...
Lua學習筆記之 Type and Values
lua是一種動態型別語言,不用特別宣告變數以及指定型別,首次賦值即為宣告.說到此點,我覺得動態語言的這種特點與彙編倒是蠻象的 不管你是什麼型別,對於底層而言,它代表的就是一記憶體位址,而操作符代表的就是對這些位址及存在於這些位址裡的量進行操作而已.閒話少說,繼續看pil,今天的內容是 types a...