跳转到内容

Scribunto 简介/使用 invoke

来自维基教科书,开放的书籍,开放的世界

如果您习惯于 MediaWiki 模板的语法,那么您可能想知道我们在上一章中看到的 #invoke 语句的语法。#invoke 语句看起来像这样

{{#invoke:Hello|hello_world}}

如您所见,它有三个部分:#invoke:Hellohello_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.,那么我们就不能直接从任何维基页面运行我们的函数。(函数可以间接运行,但我们现在不讨论这些。)

  1. 在 MediaWiki 中具有特殊功能的文本被称为魔法词,从技术上讲,#invoke 语句是一种称为解析器函数的特定类型的魔法词。您可以在 https://www.mediawiki.org/wiki/Help:Magic_words 上查看有关魔法词和解析器函数的更多文档。
华夏公益教科书