Redis Lua腳本中學教程(下)

在中學教程的上半部分咱們介紹了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類型的值只有一種,就是nil,它是一種沒有值的表現。

Boolean

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

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提供了一些基本的流程控制語句:

  • if用於條件判斷
  • while、repeat和for用於便利
  • end能夠終止if、for和while
  • until能夠終止repeat
  • break用於跳出循環
  • return用於跳出函數
  • goto會跳轉到指定位置

函數

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官網繼續深造。

相關文章
相關標籤/搜索