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 上檢視有關魔法詞和解析器函式的更多文件。