維基百科:Lua代碼風格
結構元素
編輯縮進與空格
編輯“ | And the Lord spake, saying: Thou shalt indent with four spaces, no more, no less. Four shalt be the number of spaces thou shalt indent, and the number of the indenting shall be four. Eight shalt thou not indent, nor either indent thou two, excepting that thou then proceed to four. Tabs are right out. | ” |
——The Book of Armaments,[1] |
使用Tab縮進。以前維基百科的代碼編輯器默認使用4個空格,但從bug 39616修復起都使用Tab縮進。試着限制每行的長度,方便使用小屏幕的人。
調用函數或者下標訪問數組和字典時,避免添加多餘的空格。在([, (, {和其對應項)的前後不要添加空格。
-- Yes:
hi = {1, 2, 3}
foo(hi[1], blah['a'])
-- No:
hi = { 1, 2, 3 }
foo( hi[ 1 ], blah[ 'a' ] )
blah ['b'] = hi [3]
foo (0, '')
控制流
編輯不建議將多條語句放在一行,除非表達式極短。也試着避免將多條子語句放在同一行。
-- 是:
if 1 then
foo()
bar()
else
baz()
end
if 1 then foo() end
foo(); bar(); baz();
-- 否:
if 1 then foo(); bar(); else baz(); end
if 1 then foo(); bar(); baz();
else lorem(); ipsum(); end
foo(); bar(); baz(); spam(); eggs(); lorem(); ipsum(); dolor(); sit(); amet();
如果一行太長,你可以將長語句分割至多行並且保持縮進與開括號相同。如if語句,條件可以放在多行。
-- 示例:
hello = long_function_name(var_one, var_two,
var_three, var_four)
if ((condition1
or condition2)
and condition3
and condition4) then
foo()
bar()
baz()
end
命名常規
編輯定義入口方法,使其展開參數,然後傳入前綴下劃線的同名方法。如果函數短並且簡單,忽略這條規則。
在標準庫中,包含多個單詞的函數名通常被簡單的連在一起(如setmetatable)。推薦camelCase(駝峰式命名)命名函數,以避免有歧義的函數名。
-- 参见此处代码:https://en.wikipedia.org/w/index.php?oldid=540791109
local p = {}
function p._url(url, text)
-- 在此写入代码
end
function p.url(frame)
-- 在 frame 之外指定参数并让它们通过 p._url()。返回结果。
-- 在此写入代码
return p._url(url, text)
end
return p
使用
編輯高亮Lua代碼
編輯在模塊之外(像討論頁)可以用<syntaxhighlight>標籤加上lang="lua"
屬性高亮代碼。
<syntaxhighlight lang="lua">
--code snippet
function p.main()
return "Hello world"
end
</syntaxhighlight>
生成:
--code snippet
function p.main()
return "Hello world"
end
如果想要在行內顯示代碼的話,可以使用inline
屬性。<syntaxhighlight lang="lua" inline>a = "foo"</syntaxhighlight>
生成a = "foo"
。
代碼習慣
編輯多用 local
編輯
Lua 代碼中能不用全局變量則不用全局變量。這樣可使導出整潔,同時不浪費全局變量查找的時間。
-- code snippet
local function fooHelper(arg1)
local a = {}
-- do something ...
return a
end
string.format()
編輯string.format()
對於複雜字串的構造非常有用,但是對於一些簡單任務而言就顯得畫蛇添足,只能降低運行效率。
不要用於簡單字符串拼接
編輯一般來說,在串接的元素數量不多於五個時,..
更加可讀。如果格式化字符串中存在引號、方括號等成對的字符,則還要注意拆開這些組合的次數最多一次。
-- 一般情况
return string.format('%s%s%s<br/>', foo, bar, baz) -- 不要这样
return foo .. bar .. baz .. '<br/>' -- 要这样
-- 引号/方括号,但是没有跨过引号
foo = string.format('%s<th style="text-align: right;">%s</td></tr>', ret, pageNumberWithLink(args, class, 'ALL'))
foo = ret .. '<th style="text-align: right;">' .. pageNumberWithLink(args, class, 'ALL') .. '</td></tr>'
-- 发生嵌套的情况
-- 打开写的话会拆开两次引号。
bar = string.format('<tag title="%s" href="%s">%s</tag>', t, h, c)
-- 使用括号分组或可缓解阅读难度,但输入麻烦没什么意义。
bar = '<tag ' .. ('title="' .. t .. '" ') .. ('href="' .. h ..'"') .. '>' .. c .. '</tag>'
長文本構造
編輯構造表格等大段文本時,僅應使用string.format()完成某個「小單元」的格式化,而使用..
與之前的字串連接賦值。
local builder = ''
for i, j in ipairs(foo)
-- 不要这样
builder = string.format('%s<foo bar="%s">%s</foo>', builder, fun(i), j)
-- 要这样做(容易看得出是在加后缀)
builder = builder .. string.format('<foo bar="%s">%s</foo>', fun(i), j)
end
如果你知道自己構造的文本非常大,那麼考慮使用表格存放小段文本,最後拼接。這麼做是因為Lua的字符串是不可變的,每次賦值構造拼接都會生成一個新的對象。
local builder = {}
for i, j in ipairs(foo)
-- 把这个“小单元”加进表格后面
builder[#builder+1] = string.format('<foo bar="%s">%s</foo>', fun(i), j)
end
final_string = table.concat(builder)
這樣寫的時候要切不可矯枉過正而把小單元拆開,寫出把'<foo bar="'
、fun(i)
之類的小塊一行行加進表格的麵條式代碼。
對模板格式命名
編輯string.format()
的格式模板可以考慮命名成為一個局部變量,增加可讀性。
-- 本来是这样
foo = string.format('<td title="剩余">%10g</td>', remaining)
-- 这样更好
local cell_td = '<td title="剩余">%10g</td>'
foo = cell_td:format(remaining)
不要將模板賦值放在循環中。