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”。

参见[编辑源代码]