Scribunto 简介/使用 invoke
如果您习惯于 MediaWiki 模板的语法,那么您可能想知道我们在上一章中看到的 #invoke 语句的语法。#invoke 语句看起来像这样
{{#invoke:Hello|hello_world}}
如您所见,它有三个部分:#invoke:
、Hello
和 hello_world
。如果我们将它与执行相同操作的模板(输出文本“Hello, world!”)进行比较,我们会发现它只有一个部分。
{{Hello}}
共同的部分是 Hello
,在两种情况下,它都对应于页面名称。对于 #invoke,它对应于页面 模块:Hello,对于模板,它对应于页面 模板:Hello。这让我们在 #invoke 语句中剩下两个额外的部分:#invoke:
代码本身和 hello_world
。
#invoke:
代码非常简单;它只是为了告诉 MediaWiki 软件它正在处理一个 Lua 模块,而不是模板或任何其他类型的特殊文本。[1] hello_world
代码是事情变得有趣的地方。
您可能已经注意到 hello_world
出现在 模块:Hello 的中间
p = {}
function p.hello_world()
return "Hello, world!"
end
return p
它出现在以关键字“function”开头并以关键字“end”结尾的块中。这是一个函数。Lua 中的函数很像 MediaWiki 模板。您向模板提供输入,模板处理输入,然后它向您提供一些输出。函数也是一样;您向它们提供输入,函数处理输入,然后它返回一些输出。
在本例中,我们没有提供任何输入,因为我们的函数非常简单。(稍后我们将学习如何使用 hello_world
后的括号来控制我们提供的输入。)Lua 函数中的输出由 return
关键字提供。在本例中,我们说:“创建一个没有输入并输出文本“Hello, world!”的函数。” 同时,我们也给函数起了一个名字。虽然在 Lua 中定义函数还有其他方法,但在本例中,函数名称是代码 function
之后和括号之前的所有内容。换句话说,函数名称是 p.hello_world
。
那么为什么是 p.
?为什么不直接将名称命名为 hello_world
?答案是 p.
是我们告诉 Scribunto 我们希望我们的函数从 #invoke 中可用。如果我们省略 p.
,那么我们就不能直接从任何维基页面运行我们的函数。(函数可以间接运行,但我们现在不讨论这些。)
- ↑ 在 MediaWiki 中具有特殊功能的文本被称为魔法词,从技术上讲,#invoke 语句是一种称为解析器函数的特定类型的魔法词。您可以在 https://www.mediawiki.org/wiki/Help:Magic_words 上查看有关魔法词和解析器函数的更多文档。