能源智库:Lua

来自能源智库
SolarLib讨论 | 贡献2016年8月5日 (五) 19:02的版本 (创建页面,内容为“{{NoteTA|G1=IT}} {{infopage|WP:Lua}} Lua編程語言目前通過MediaWiki上的Scribunto外掛程式引入到中文維基百科當中...”)

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

Lua错误:无法创建进程:proc_open不可用。请检查PHP的指令配置“disable_functions”。

Lua編程語言目前通過MediaWiki上的Scribunto外掛程式引入到中文維基百科當中使用。要在模板中嵌入Lua腳本,可加入Scribunto中的{{#invoke:}}功能。

Lua原始碼存放在「模組」頁面中(如模块:Example),再在模板頁中以{{#invoke:}}來調用。

運行模塊

普通維基頁面通過#invoke分析器函數來調用模塊。#invoke的句法與一般模板相似,但有些許不同。最重要的是必須指定函數名稱。函數會拿一組輸入值,通過一系列指令,輸出一個值。[1]這和模板很像:輸入參數,模板運作後,輸出一個值。Lua模塊中可以有多個函數,但單個模板則只能有一個。

另外,模塊不可以直接運行,而是有指定要運行的單個函數。模塊是一組函數綜合起來的裝載體,自身並沒有功能。只有指定要運行哪一個函數,該模塊才會知道要運行哪一個函數。

最簡單的模塊運行方法如下:

{{#invoke:''模塊名稱''|''函數名稱''}}

例如,Module:Example就可以如此運行,其含有一個叫做「hello」的函數。

  • {{#invoke:Example|hello}}脚本错误:没有此类模块“Example”。

運用參數

參數進入模塊腳本的方式與進入模板一樣。不過,在調用模塊時第一個豎線之後必須要先指定函數名,「第二個」豎線之後才是正式參數。

-{}-{{#invoke:模塊名稱|函數名稱|第一參數|第二參數|帶名稱的參數 = 數值}}

例如Module:BaseConvert可以轉換數值的進位制:

  • {{#invoke:BaseConvert|convert|n=9|base=2}}脚本错误:没有此类模块“BaseConvert”。
  • {{#invoke:BaseConvert|convert|n=30|base=16}}脚本错误:没有此类模块“BaseConvert”。

多數模塊都帶有解釋其功用說明。

關於Lua

Lua是一種利用多重编程范式的腳本語言,可用於分析數據,計算公式及添加格式等。雖然Lua腳本可以非常簡單,但其功能強大,能夠支持各種複雜結構,如表格、動態函數等。Lua同時也支持含有自我嵌套函數的遞歸過程。因此在設計Lua程式時,須注意不要加入過度複雜的組件,以免他人無法有效閱讀腳本。以下腳本(如在Module:HelloWorld)可以輸出Hello World!信息:

-- 維基百科上的Lua模塊必須在開頭定義一個變量,使參數可從外面存取。
-- 變量的名稱沒有限制,且可以含有數據。
my_object = {};

-- 在該變量上運行函數。在維基百科中可以用#invoke指令調用這些函數。
-- 函數被調用時,維基百科會向函數發送數據。這一數據應包含在frame以內。
my_object.hello = function( frame ) 

    -- 定義局部變量。
    local str = "Hello World!"  

    -- 終止函數,並把str中的資料輸出到維基百科。
    -- 不可使用print函數,所以所有輸出要用return
    return str    

-- 函數結束。
end

-- 模塊底部須用return把帶有函數的變量送回維基百科。
return my_object

-- 現在{{#invoke: HelloWorld | hello }}就可以調用以上函數了
-- #invoke指令先指定模塊名稱,HelloWorld,再指定某一函數,hello

Lua腳本在內文中可以加在"<source lang="lua">...</source>"裡面來加上顏色標註。詳見Lua條目。

在MediaWiki中使用Lua的教程,可見mw:Extension:Scribunto/Lua reference manual

單元測試

Module:UnitTests提供Lua腳本的單元測試。它可用一組指定輸入值來運行特定腳本,並確認輸出值符合預期。單元測試可以很快地找到改變腳本後所產生的新問題。

模塊(如Module:Example)的單元測試應該放在其附頁Module:Example/testcases裡面,並在Module talk:Example/testcases上用{{#invoke: Bananas/testcases | run_tests}}運行。測試方法必須以「test」開頭。以下是Module:Example/testcases的例子。

-- [[Module:Example]]的單元測試。進入討論頁可運行測試。
local p = require('Module:UnitTests')
 
function p:test_hello()
    self:preprocess_equals('{{#invoke:Bananas | hello}}', 'Hello, world!')
end
 
return p

Special:Whatlinkshere/Module:UnitTests頁面列出所有進行單元測試的模塊。

維基百科特有功能

{{#invoke:}}當中的輸入值在進入Lua腳本時一定是字符串格式。Lua只能輸出非包含及不含{{...}}的維基代碼。所有Lua腳本的CPU運行時間都限制在10秒。相比一般的Lua,Scribunto的Lua版本缺乏多個函數(見:mw:Extension:Scribunto/Lua reference manual#Differences from standard Lua)。Scribunto也提供大量用于和MediaWiki对接的函数(mw:Extension:Scribunto/Lua reference manual#Scribunto_libraries)。

Lua輸入值限制

Lua腳本只在頁面解析時才會運行。所以要對Lua輸入參數,必須通過「編輯此頁」,而不可在頁面中加入一個輸入框,作實時處理,也不可動態點擊挑選函數功能。Lua可以接受的輸入值包括任何「可包含」的文字頁面。這並不包括圖像文件(甚至.SVG文件都不可)和分類中的頁面列表等。

維基代碼

經「包含」的標題經常會有諸如「UNIQ5ae8f2aa414ff233-h-3--QINU」的隱藏文字。這些文字要去除之後才會有效解析。

類似'[[Wikipedia:Help|]]的維基鏈接在經Lua輸出後是沒有用的,必須完整地寫成[[Wikipedia:Help|Help]]。其他保存前自動進行的轉換,如~~~~替換為簽名,都會在Lua輸出時無法進行。模板包含、解析函數以及變量替換(即{{...}})都無法進行。模板:Tag模板:Tag等標籤也不會在Lua程式當中處理。

用于隐藏文字(注释)的代码<!--...-->在Lua中对应的代码是在要注释的文字前输入--(不能在字符串内)。Lua 另外也可以使用 --[[ 开始大段注释,用]]结束。

已轉換的模板

請在已轉換成Lua程式的模板說明頁上加上{{lua|模組名稱}}Lua错误:无法创建进程:proc_open不可用。请检查PHP的指令配置“disable_functions”。 之后这些模板会归入Category:基于Lua编程语言的模板及其子分类中,你可以在这个分类中找到这些模板。

腳註

模板:Reflist

资源

文档

指南

Lua相关文章

模块链接列表

  • {{ml|Test|sandbox=Test/sandbox}}用于生成模块链接:Module:Test Lua错误:无法创建进程:proc_open不可用。请检查PHP的指令配置“disable_functions”。
  1. 也可以有多個輸出值,但這類函數一般不用於#invoke中。