在中學教程的上半部分咱們介紹了Redis Lua相關的命令,沒有看過或者忘記的同窗能夠步行前往直接使用機票Redis Lua腳本中學教程(上)。今天咱們來簡單學習一下Lua的語法。html
在介紹Lua語法以前,先來介紹一下Lua的身世。Lua是由簡稱爲PUC-Rio的團隊設計、開發和維護的。Lua在葡萄牙語中是月亮的意思,因此它不是簡寫,而是一個名詞。因此只能寫成Lua,而不能寫成LUA或者其餘什麼的。接下來咱們正式入門Lua。git
變量名能夠是由字母、數字和下劃線組成的字符串,但不能以數字開頭。另外須要注意的是,須要儘可能避免使用下劃線加一個或多個大寫字母格式的變量名,由於這是Lua的保留字,除了這種格式之外,還有一些普通格式的保留字:github
and | break | do | else | elseif |
---|---|---|---|---|
end | false | for | function | goto |
if | in | local | nil | not |
or | repeat | return | then | true |
until | while |
Lua是大小寫敏感的,and是保留字,但And和AND不是。編程
前面咱們提到過Redis不支持Lua的全局變量,但Lua自己是支持全局變量的。數組
全局變量不須要聲明,直接一個未初始化的變量時,它的值是nil。函數
> b --> nil
> b = 10
> b --> 10
複製代碼
若是顯示的將nil賦值給某個全局變量,Lua會認爲咱們再也不使用這個變量。學習
Lua的變量默認是全局變量,局部變量須要顯示聲明。局部變量能夠避免增長沒必要要的名稱來混淆全局環境,同時也能避免兩部分代碼的命名衝突。另外,訪問局部變量要比訪問全局變量的速度更快。ui
局部變量的使用範圍是有限制的,只在它聲明的塊中可用。(塊能夠是控制結構體或函數體或者是整個文件中)lua
x = 10
local i = 1 -- local to the chunk
while i <= x do
local x = i * 2 -- local to the while body
print(x) --> 2, 4, 6, 8, ...
i = i + 1
end
if i > 20 then
local x -- local to the "then" body
x = 20
print(x + 2) -- (would print 22 if test succeeded)
else
print(x) --> 10 (the global one)
end
print(x) --> 10 (the global one)
複製代碼
在交互模式下,每次輸入都是一塊代碼,當你輸入local i = 1時,就定義了一個局部變量i,而當你在下一行使用i時,發現它又成了全局變量。所以上面的栗子就不能用了。爲了解決這個問題,咱們須要在程序中顯式的使用do-end標記代碼塊的範圍。spa
local x1, x2
do
local a2 = 2*a
local d = (b^2 - 4*a*c)^(1/2)
x1 = (-b + d)/a2
x2 = (-b - d)/a2
end -- scope of 'a2' and 'd' ends here
print(x1, x2) -- 'x1' and 'x2' still in scope
複製代碼
使用這種方式標記代碼塊範圍是一種良好的習慣,而使用局部變量編程也要優於使用全局變量,所以有不少人呼籲Lua默認應該定義局部變量,可是這樣也會存在問題。最好的解決方案是不要默認,使用全部的變量以前都要聲明。
Lua有一個常見的習語:
local foo = foo
複製代碼
這裏定義了一個局部變量foo,並把全局變量foo的值賦給局部變量。這一習語主要用來提高變量foo的訪問速度,或者對變量進行暫存,防止其餘函數改變這個變量的值。
Lua的單行註釋使用雙橫線「--」表示,雙橫線後的內容爲註釋內容。
多行註釋的一種表現是以雙橫線加雙左中括號開始,以雙右中括號結束。例如:
--[[A multi-line long comment ]]
複製代碼
不過一般咱們使用另外一種寫法:以雙橫線加雙左中括號開始,以雙橫線加雙右中括號結束,這種寫法看起來更加美觀,同時解註釋也更加方便:
--[[ print(10) -- no action (commented out) --]]
複製代碼
解註釋
---[[
print(10) --> 10
--]]
複製代碼
這裏稍微解釋一下這種寫法的原理,註釋時,後一組雙橫線在註釋內容中,所以不起做用,只爲了對稱,效果和普通多行註釋同樣。而解註釋時,第一組雙橫線前又加了一個橫線,就不能認爲是多行註釋了,只能當作單行註釋,所以,第一行被註釋掉了,這時後一組雙橫線就會起做用了,註釋掉後面的雙右中括號。
Lua是一種動態類型語言,它有8種基本類型:nil,Boolean,number,string,userdata,function,thread和table。type函數能夠返回指定值的類型:
> type(nil) --> nil
> type(true) --> boolean
> type(10.4 * 3) --> number
> type("Hello world") --> string
> type(io.stdin) --> userdata
> type(print) --> function
> type(type) --> function
> type({}) --> table
> type(type(X)) --> string
複製代碼
Nil類型的值只有一種,就是nil,它是一種沒有值的表現。
Boolean類型有兩種取值,@false{} and @true{}。可是Boolean類型並不能囊括全部的條件值:在條件判斷時,Lua會將false和nil判斷爲假,其餘的都判斷爲真。
畫外音:Lua把0和空字符串也判斷爲真,這點感受設計的不太好啊
and、or和not是Lua的邏輯運算符。
and的運算方法是,判斷第一個操做數是否是false,若是不是,結果就是第二個操做數。
or的運算方法是,判斷第一個操做數是否是真,若是不是,結果就是第二個操做數。
> 4 and 5 --> 5
> nil and 13 --> nil
> false and 13 --> false
> 0 or 5 --> 0
> false or "hi" --> "hi"
> nil or false --> false
複製代碼
Table是Lua中主要的(也是惟一的)結構化數據表現類型。它能夠用來表現不少種數據類型,如數組、集合、記錄等。
每一個表的key能夠是不一樣類型的,對於未定義索引的表元素,它的默認值是nil。和其餘大部分語言不一樣的是Lua中表的下標是從1開始的。
Table有兩種格式:record-style和list-style
record-style能夠直接用"."訪問,list-style能夠用下標來訪問。定義時能夠一塊兒定義。
polyline = {color="blue",
thickness=2,
npoints=4,
{x=0, y=0},
{x=-10, y=0},
{x=-10, y=1},
{x=0, y=1}
}
複製代碼
當咱們訪問一個可能爲空的Table,每每須要先判斷非空
if lib and lib.foo then ....
複製代碼
使用這種方式訪問結構比較深的表示就會很是痛苦:
zip = company and company.director and
company.director.address and
company.director.address.zipcode
複製代碼
Lua沒有像C#同樣提供?.這樣的操做,不過咱們可使用or {}的形式來處理。
zip = (((company or {}).director or {}).address or {}).zipcode
複製代碼
Lua提供了一些基本的流程控制語句:
Lua中函數能夠接收的參數是list,若是沒有參數,也須要寫一對空的括號"()"(一句廢話)。若是隻有一個參數,則括號可寫可不寫。Lua還提供了一種特殊的函數訪問方法,有興趣的話能夠參考https://www.lua.org/pil/16.html
o:foo(x)
複製代碼
Lua程序中既可使用定義在Lua中的函數,也可使用定義在C語言中的函數。
Lua函數有一個很是方便的特性:能夠返回多個結果。
function maximum (a)
local mi = 1
local m = a[mi]
for i = 1, #a do
if a[i] > m then
mi = i; m = a[i]
end end
return m, mi
end
print(maximum({8,10,23,12,5})) --> 23 3
複製代碼
Lua能夠自動調整返回結果的數量,當函數做爲語句調用時,會捨棄全部返回值;當函數做爲表達式調用時,只保留第一個返回值;若是要得到所有返回值,函數調用須要是表達式最後一個。
Lua函數也支持可變參數:
function add (...)
local s = 0
for _, v in ipairs{...} do
s=s+ v
end
return s
end
print(add(3, 4, 10, 25, 12)) --> 54
複製代碼
來簡單總結一下,本文咱們介紹了Lua的基本語法,包括如何定義變量(包括全局變量和局部變量),8種基本數據類型,流程控制語句以及Lua中函數的一些特性。相信看完本文,你就能夠寫一些簡單的Lua腳本了。
對Lua感興趣的同窗能夠自行前往Lua官網繼續深造。