<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.wikiw.cn/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AArguments%2Fdoc</id>
	<title>模块:Arguments/doc - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.wikiw.cn/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AArguments%2Fdoc"/>
	<link rel="alternate" type="text/html" href="https://www.wikiw.cn/index.php?title=%E6%A8%A1%E5%9D%97:Arguments/doc&amp;action=history"/>
	<updated>2026-04-08T16:34:02Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://www.wikiw.cn/index.php?title=%E6%A8%A1%E5%9D%97:Arguments/doc&amp;diff=2026&amp;oldid=prev</id>
		<title>2023年9月5日 (二) 13:32 imported&gt;SunAfterRain</title>
		<link rel="alternate" type="text/html" href="https://www.wikiw.cn/index.php?title=%E6%A8%A1%E5%9D%97:Arguments/doc&amp;diff=2026&amp;oldid=prev"/>
		<updated>2023-09-05T13:32:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{NoteTA&lt;br /&gt;
|G1 = IT&lt;br /&gt;
|G2 = MediaWiki&lt;br /&gt;
}}&lt;br /&gt;
{{Documentation subpage}}&lt;br /&gt;
{{High-risk|3119518|all-pages=yes}}&lt;br /&gt;
{{Synchronizer|lang=en}}&lt;br /&gt;
此模块是调用其他模块的模块。&lt;br /&gt;
&lt;br /&gt;
此模块提供了对通过&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;（以下简称#invoke）传递参数的简单处理。这是元模块（meta-module），只能被其他模块使用，而不应被#invoke直接调用。其特性如下：&lt;br /&gt;
* 对参数的简易修整，移除空白参数。&lt;br /&gt;
* 参数可以在当前框架或父框架中同时传递。（具体见下）&lt;br /&gt;
* 参数可以直接通过其他Lua模块或调试控制台传递。&lt;br /&gt;
* 可自定义更多特性。&lt;br /&gt;
&lt;br /&gt;
== 基本用法 ==&lt;br /&gt;
&lt;br /&gt;
首先，您需要通过require函数加载这个模块。这个模块包含了一个名为&amp;lt;code&amp;gt;getArgs&amp;lt;/code&amp;gt;的函数。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最简单的方法是在使用getArgs函数。变量&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;是包含#invoke参数的表（table）。（详见下文。）&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	-- 主要的模块放此处。&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 最佳实践 ===&lt;br /&gt;
最佳的做法是，先用专门的函数来处理来自#invoke的参数。这样，其他Lua模块直接调用该模块时，就无需再需要弄一个frame对象，从而提升性能，减小开销。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame) -- 从#invoke中获得的参数&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	-- 主要模块放此处。&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== 多个函数 ===&lt;br /&gt;
如果你需要多个函数使用这些参数，而且你希望这些函数可用于#invoke，你可以使用包装函数（wrapper function）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function makeInvokeFunc(funcName)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		local args = getArgs(frame)&lt;br /&gt;
		return p[funcName](args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.func1 = makeInvokeFunc(&amp;#039;_func1&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._func1(args)&lt;br /&gt;
	-- 第一个函数的代码。&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.func2 = makeInvokeFunc(&amp;#039;_func2&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._func2(args)&lt;br /&gt;
	-- 第二个函数的代码。&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 选项 ===&lt;br /&gt;
&lt;br /&gt;
你可以使用如下面这段代码所示的选项。这些选项会在下文中介绍。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	trim = false,&lt;br /&gt;
	removeBlanks = false,&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		-- 用于处理一个参数的函数的代码。&lt;br /&gt;
	end,&lt;br /&gt;
	frameOnly = true,&lt;br /&gt;
	parentOnly = true,&lt;br /&gt;
	parentFirst = true,&lt;br /&gt;
	wrappers = {&lt;br /&gt;
		&amp;#039;Template:一个包装模板&amp;#039;,&lt;br /&gt;
		&amp;#039;Template:另一个模板&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	readOnly = true,&lt;br /&gt;
	noOverwrite = true&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 修整参数和移除空白的参数 ===&lt;br /&gt;
&lt;br /&gt;
将模板转换为Lua的新手易在空白参数上犯错。在模板语法中，空白字符串和仅包含空白字符（whitespace，空格、换行等）的字符串被视为假（false）。然而，在Lua，空白字符串和只包含空白字符的字符串则会被视为真（true）。这就是说，如果你在写Lua模块时，不注意这些参数，你可能会把本想视为假的东西视为真。为了避免这种情况，这个模块默认会移除所有的空白参数。&lt;br /&gt;
&lt;br /&gt;
类似地，空白字符在处理位置参数（positional arguments）时会发生问题。虽然来自#invoke的具名参数（named arguments）中的多余空白字符会被修整（trim），但是对一些位置参数仍然保留。大多数时候，多余的空白字符是不需要的，所以这个模块默认剔除这些空白字符。&lt;br /&gt;
&lt;br /&gt;
然而，有时输入时又需要使用这些空白字符，或者需要保留空白参数。把某些模板准确地转化为模块时，可能有必要这么做。如果你需要这样，你可以将&amp;lt;code&amp;gt;trim&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;removeBlanks&amp;lt;/code&amp;gt;参数设为&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	trim = false,&lt;br /&gt;
	removeBlanks = false&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 对参数进行自定义格式化 ===&lt;br /&gt;
&lt;br /&gt;
有时，你需要移除某些空白参数，但是还有些空白参数又不想移除，或者，你需要将所有位置参数转化为小写字母。你可以使用&amp;lt;code&amp;gt;valueFunc&amp;lt;/code&amp;gt;选项。这个参数的值必须是一个接收两个参数&amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;并且只返回一个值的函数，这个值是你在{{code|args}}表中索引名为{{code|key}}的域时得到的值。&lt;br /&gt;
&lt;br /&gt;
例1：这个函数不会动第一个参数的空白字符，但是其他参数的空白字符会剔除并移除其他所有空白参数。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		if key == 1 then&lt;br /&gt;
			return value&lt;br /&gt;
		elseif value then&lt;br /&gt;
			value = mw.text.trim(value)&lt;br /&gt;
			if value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				return value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例2：这个函数移除空白参数并将所有参数转化为小写字母，但是不会剔除位置参数的空白字符。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		if not value then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		value = mw.ustring.lower(value)&lt;br /&gt;
		if mw.ustring.find(value, &amp;#039;%S&amp;#039;) then&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注：如果传入了既不是字符串又不是空值（nil）的值，上面这个函数会失败。当你在你的模块的主函数使用&amp;lt;code&amp;gt;getArgs&amp;lt;/code&amp;gt;函数，而且那个函数被另一个Lua模块调用时，就可能出现此情况。这种情况下，你需要检查你输入的内容的类型（type）。如果你使用一个专门用于来自#invoke的参数的函数时，不会有这个问题，你如你有&amp;lt;code&amp;gt;p.main&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;p._main&amp;lt;/code&amp;gt;函数，或者类似。&lt;br /&gt;
&lt;br /&gt;
{{cot|带有数据类型检查功能的例1和例2}}&lt;br /&gt;
例1：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		if key == 1 then&lt;br /&gt;
			return value&lt;br /&gt;
		elseif type(value) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			value = mw.text.trim(value)&lt;br /&gt;
			if value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				return value&lt;br /&gt;
			else&lt;br /&gt;
				return nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例2：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		if type(value) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			value = mw.ustring.lower(value)&lt;br /&gt;
			if mw.ustring.find(value, &amp;#039;%S&amp;#039;) then&lt;br /&gt;
				return value&lt;br /&gt;
			else&lt;br /&gt;
				return nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{cob}}&lt;br /&gt;
&lt;br /&gt;
而且，请注意，每次从{{code|args}}表中请求参数时，都会调用{{code|valueFunc}}函数，所以请留意性能，确保不要加入低效的代码。&lt;br /&gt;
&lt;br /&gt;
=== 框架与父框架 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;表中的参数可以从当前框架或父框架同时传递。这句话有点难懂，可以看下面的例子。假设我们有个称为&amp;lt;code&amp;gt;模块:ExampleArgs&amp;lt;/code&amp;gt;的模块，这个模块输出（print）前两个传入的位置参数。&lt;br /&gt;
&lt;br /&gt;
{{cot|模块:ExampleArgs的代码}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local first = args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local second = args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
	return first .. &amp;#039; &amp;#039; .. second&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{cob}}&lt;br /&gt;
&lt;br /&gt;
然后，&amp;lt;code&amp;gt;模块:ExampleArgs&amp;lt;/code&amp;gt;被&amp;lt;code&amp;gt;模板:ExampleArgs&amp;lt;/code&amp;gt;调用，&amp;lt;code&amp;gt;模板:ExampleArgs&amp;lt;/code&amp;gt;内容如下：&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:ExampleArgs|main|firstInvokeArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;。它会输出内容firstInvokeArg。&lt;br /&gt;
&lt;br /&gt;
现在，如果我们调用&amp;lt;code&amp;gt;模板:ExampleArgs&amp;lt;/code&amp;gt;，其结果如下表所示：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 50em; max-width: 100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 60%;&amp;quot; | 代码&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | 结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstInvokeArg&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstInvokeArg&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg|secondTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstInvokeArg secondTemplateArg&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
有三个选项可以用来改变行为：&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;parentFirst&amp;lt;/code&amp;gt;。如果设置&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;，那么只有从当前框架传入的参数可以被接受；如果设置 &amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;，那么只有从父框架传入的参数会被接受；如果你设置&amp;lt;code&amp;gt;parentFirst&amp;lt;/code&amp;gt;，那么当前框架和父框架的参数都会接受，但是父框架优先于当前框架。以下是对于&amp;lt;code&amp;gt;模板:ExampleArgs&amp;lt;/code&amp;gt;的结果：&lt;br /&gt;
&lt;br /&gt;
; 设为frameOnly时&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 50em; max-width: 100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 60%;&amp;quot; | 代码&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | 结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstInvokeArg&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstInvokeArg&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg|secondTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstInvokeArg&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
; 设为parentOnly时&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 50em; max-width: 100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 60%;&amp;quot; | 代码&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | 结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstTemplateArg&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg|secondTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstTemplateArg secondTemplateArg&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
; 设为parentFirst时&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 50em; max-width: 100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 60%;&amp;quot; | 代码&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | 结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstInvokeArg&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstTemplateArg&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg|secondTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| firstTemplateArg secondTemplateArg&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
注意：&lt;br /&gt;
# 如果你同时设置了&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;两个选项，模块将不会从#invoke获取任何参数。这显然不是你需要的。&lt;br /&gt;
# 有时，父框架可能无效，比如getArgs是从父框架传入的，而不是当前框架。这种情况下，只有框架参数会被使用（除非设置了parentOnly，那种情况下不会使用任何参数），而且&amp;lt;code&amp;gt;parentFirst&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;选项都会没有效果。&lt;br /&gt;
&lt;br /&gt;
=== 包装 ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;包装（wrapper）&amp;#039;&amp;#039;选项用于指定一部分模板作为&amp;#039;&amp;#039;包装模板（wrapper templates）&amp;#039;&amp;#039;，也就是说，要调用模块的模板。如果模块检测到是被包装模板调用的，则只会检查父框架中的参数；否则，只检查传递到getArgs的框架的参数。这允许模块要么被#invoke调用，要么通过包装模板调用，而不会由于为每次参数寻找（argument lookup）同时检查框架和父框架而损失性能。&lt;br /&gt;
&lt;br /&gt;
比如，[[Template:Side box]]的内容（除了{{tag|noinclude}}标签内的）为&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:Side box|main}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;。检查直接传递到模板的#invoke语句的参数是没有道理的，因为这里没有指定参数。我们可以通过&amp;#039;&amp;#039;parentOnly&amp;#039;&amp;#039;选项避免检查传递到#invoke的参数，但如果这样做，#invoke也不会从其他页面起作用。如果是这样，代码&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:Side box|main|text=Some text}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;中的{{para|text|Some text}}会直接忽略，无论是从哪个页面使用的。使用&amp;lt;code&amp;gt;wrappers&amp;lt;/code&amp;gt;选项以指定“Template:Side box”为包装，我们可以使得&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:Side box|main|text=一些文本}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;能够从大多数页面使用，而不需要检查[[Template:Side box]]页面自身的参数。&lt;br /&gt;
&lt;br /&gt;
容器可以指定为字符串，或字符串的数组。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	wrappers = &amp;#039;Template:Wrapper template&amp;#039;&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	wrappers = {&lt;br /&gt;
		&amp;#039;Template:Wrapper 1&amp;#039;,&lt;br /&gt;
		&amp;#039;Template:Wrapper 2&amp;#039;,&lt;br /&gt;
		-- 可以在此处添加多个包装模板。&lt;br /&gt;
	}&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意：&lt;br /&gt;
# 模块会自动检测是否是从包装模板的/sandbox子页面调用的，所以不需要清楚地指定沙盒页面。&lt;br /&gt;
# &amp;#039;&amp;#039;wrappers&amp;#039;&amp;#039;选项有效改变&amp;#039;&amp;#039;frameOnly&amp;#039;&amp;#039;和&amp;#039;&amp;#039;parentOnly&amp;#039;&amp;#039;的默认的选项。如果，比如，设置了&amp;#039;&amp;#039;wrappers&amp;#039;&amp;#039;时清楚地将&amp;#039;&amp;#039;parentOnly&amp;#039;&amp;#039;设为false，通过包装模板调用会导致同时加载框架和父框架的参数，尽管非经由包装模板的调用会导致只加载框架参数。&lt;br /&gt;
# 如果设置了&amp;#039;&amp;#039;wrappers&amp;#039;&amp;#039;但是没有可用的父框架，模块总是会从传递给&amp;lt;code&amp;gt;getArgs&amp;lt;/code&amp;gt;的框架中得到参数。&lt;br /&gt;
&lt;br /&gt;
=== 写入参数表 ===&lt;br /&gt;
&lt;br /&gt;
有时给参数表写入新值会很有用。这可以通过此模块的默认设置实现。（然而，记住最好的代码风格是，将需要的参数表中的参数复制到一个新的表中。）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
args.foo = &amp;#039;一些值&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可以带有&amp;lt;code&amp;gt;readOnly&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;noOverwrite&amp;lt;/code&amp;gt;选项修改此行为。如果设置了&amp;lt;code&amp;gt;readOnly&amp;lt;/code&amp;gt;，则完全不可能将任何值写到参数表中。如果设置了&amp;lt;code&amp;gt;noOverwrite&amp;lt;/code&amp;gt;，则可以将新值添加到此表，但是如果需要重写从#invoke传递的任何参数则不可能添加值。&lt;br /&gt;
&lt;br /&gt;
=== ref标签 ===&lt;br /&gt;
&lt;br /&gt;
模块使用[[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#Metatables|元表]]以从#invoke中获取参数。这允许不使用&amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt;函数就获取框架参数和父框架参数。如果你需要将{{tag|ref}}标签作为输入时，这会很有用。&lt;br /&gt;
&lt;br /&gt;
{{tag|ref}}标签是从Lua中获取的，因此会被MediaWiki软件处理，引用会在文章底部的参考文献列表中显示。如果模块继续从输出中省略索引标签，则会产生一个假引用&amp;lt;!-- If your module proceeds to omit the reference tag from the output, you will end up with a phantom reference --&amp;gt; —— 在参考文献列表中显示，但是没有与之链接的数字。模块如果使用&amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt;来检测是否从框架或父框架中使用参数，就会出现此问题，因为这些模块会自动处理每一个可用变量。&lt;br /&gt;
&lt;br /&gt;
此模块允许既获取框架又获取父框架而仅在需要时获取这些参数，从而解决此问题。然而，模块其他位置使用&amp;lt;code&amp;gt;pairs(args)&amp;lt;/code&amp;gt;时，仍会出现此问题。&lt;br /&gt;
&lt;br /&gt;
=== 已知限制 ===&lt;br /&gt;
&lt;br /&gt;
元表（metatable）的使用也有其缺点。大多数正常Lua表工具都不会对args表正常工作，包括&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;操作符号、&amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt;函数和表库（table library）中的函数。如果这对你的模块重要，你需要使用你自己的用来处理参数的函数，而不是这个模块。&amp;lt;includeonly&amp;gt;{{#ifeq:{{SUBPAGENAME}}|sandbox||&lt;br /&gt;
[[Category:维基百科元模块]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;SunAfterRain</name></author>
	</entry>
</feed>