Help:模組

出自滚动的天空Wiki

模組(module)是指「模組」命名空間下的用Lua語言編寫的頁面。大多數模組都可以通過{{#invoke:}}解析器函數調用,亦可在Lua中通過requiremw.loadData訪問。

模組基於Scribunto擴展,並使用Lua 5.1。關於Lua語言的用法,請參見Help:Lua

每個模組都是一個Lua檔案。每運行一個模組時,都會建立一個單獨的環境(environment)。模組應該返回(return)一個值。

調用模組[編輯原始碼]

解析器函數{{#invoke:}}可用於調用一個模組。該解析器函數的語法是:{{#invoke:模組名稱|函數名稱|參數……}}。這將會使用對應的模組,並在該模組的返回值中訪問對應名稱的函數,調用該函數並將當前的框架對象作為參數。通過該框架對象可以訪問模組調用時訪問的參數。

如果該模組不存在,或者該模組返回的值不是表,或者表中對應的欄位不可調用,那麼該調用就會失敗。訪問模組的返回值的欄位時,會受到元表影響。

例如,假如「模組:Example」的內容如下:

local p = {}

function p.main(frame)
    return "Hello, world!"
end

return p

那麼,{{#invoke:Example|main}}就會調用上面的main函數,並返回「Hello, world!」。

框架對象和參數[編輯原始碼]

每通過{{#invoke:}}調用一個模組時,會將當前的框架對象作為參數。這裡一般將框架對象記為frame

調用模組時的參數表可以通過frame.args訪問。這個參數表是通過元表控制的,可以訪問或迭代,但不能被賦值或者求長。和模板參數一樣,匿名參數會保留兩端的所有空格,而明確指定序號的位次參數和命名參數則會截去兩端的空格。

例如,如果將上述模組的內容改為如下:

local p = {}

function p.main(frame)
    local args = frame.args
    return "Hello, " .. (args[1] or "world") .. "!"
end

return p

那麼,{{#invoke:Example|main|Rollling Sky}}就會得到「Hello, Rolling Sky!」。

參數表可以迭代,但需要注意的是,與普通的表類似,參數表的迭代順序是不確定的,而不是像{{#forargs:}}解析器函數那樣按照書寫順序迭代參數。位次參數仍可迭代。此外,還需要注意的是,位次參數即使明確指定了名稱,在frame.args中,鍵依然是數字,而非字符串。

模組:Arguments模組可以用來進一步處理模組調用的參數,詳見該模組的文檔。

在模組內加載模組[編輯原始碼]

在模組內,可以使用require加載另一個模組,該函數將返回那個模組的返回值。

如果模組返回的是數據,那麼可以使用mw.loadData加載。與require不同,mw.loadData只會加載數據,而且每個頁面只會加載一次數據,也就是說如果某個頁面多次使用mw.loadData獲取某個模組的數據的話,那個模組只會運行一次。

基於模組的模板[編輯原始碼]

有時候需要將特定的模組調用做成模板,這種情況下,模組可以通過frame:getParent().args獲取模板參數。例如,假如「模組:ExampleModule」中有如下內容:

local p = {}

function p.main(frame)
    local moduleArg = frame.args[1]
    local parentFrame = frame:getParent()
    local templateArg = parentFrame and parentFrame.args[1]
    return string.format("模块参数:%s,模板参数:%s", tostring(moduleArg), tostring(templateArg))
end

return p

同時,「模板:ExampleTemplate」中有如下內容:

{{#invoke:ExampleModle|main|A}}

那麼,調用{{ExampleTemplate|B}}就可以得到「模組參數:A,模板參數:B」。

參見[編輯原始碼]

跳舞的線Wiki