1 Lua 簡介
Lua 是一個由標準C語言開發的、開源的、可擴充套件的、輕量級的、弱型別的、解釋型指令碼語言,是於1993年由巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)的三人研究小組使用標準C語言開發。
官網:https://www.lua.org/
2 安裝
注意 原始碼安裝時,需要先安裝gcc-c++
yum - y install gcc-c++
安裝過程不在贅述
安裝後,可以透過以下命令查詢程式路徑
whereis lua
3 語法基礎
3.1 註釋
Lua的行註釋為兩個連續的減號,段註釋以--[[ 開頭,以--]] 結束。
3.2 資料型別
Lua 中有8種型別,分佈為:nil、boolean、number、string、userdata、function、thread 和 table。透過type()函式可以檢視一個資料的型別。
資料型別 | 描述 |
nil | 只有值nil屬於該類,表示一個無效值,與Java中的null類似。但在條件表示式中相當於false。 |
boolean | 包含兩個值:false和true。 |
number | 表示雙精度型別的實浮點數。 |
string | 字串,由一對雙引號或單引號括起來。當一個字串包含多行時,可以在第一行中以 [[ 開頭,在最後一行中以 ]] 結尾,那麼在 [[ 與 ]] 括起來的這多行內容就是一個字串。換行符為字串“\n”。 |
table | 類似於Java中的陣列,但比陣列的功能更強大,更靈活。 |
function | 由 C 或 Lua 編寫的函式 |
thread | 協同執行緒,是協同函式的執行體,即正在執行的協同函式。 |
userdata | 一種使用者自定義函式,用於表示一種由應用函式或C/C++語言庫所建立的型別,可以將任意C/C++的任意資料型別的資料儲存到Lua變數中呼叫。 |
3.3 識別符號
識別符號主要包含保留字、變數、常量、方法名、函式名、類名等。Lua的識別符號由字母、數字與下劃線組成,但不能以數字開頭。Lua是大小寫敏感的。
(1)保留字
Lua常見的保留字共有22個。不過,除了這22個外,Lua中還定義了很多的內建全域性變數,這些內建全域性變數的一個共同特徵是,以下劃線開頭後跟全是大寫字母。所以,我們在定義自己的識別符號時不能與這些保留字、內建全域性變數重複。
and | break | do | else |
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while | goto |
(2)變數
Lua是弱型別語言,變數不需型別宣告即可直接使用。變數分為全域性變數和區域性變數。Lua中的變數預設都是全域性變數,即使宣告在語句塊或函式里。全域性變數一旦宣告,在當前檔案中的任何地方都可以訪問。區域性變數local相當於Java中的private變數,只能在宣告的語句塊中使用。
(3)動態型別
Lua是動態型別語言,變數的型別可以隨時改變,無需宣告。
3.4 運算子
運算子是一種特殊的符號,用於告訴直譯器執行特定的數學或者邏輯運算。Lua提供了以下幾種運算子型別。
(1)算數運算子
設定A的值為10,B的值為20.
運算子 | 描述 | 例項 |
+ | 加法 | A+B 輸出結果 30 |
- | 減法 | A-B 輸出結果 -10 |
* | 乘法 | A*B 輸出結果 200 |
/ | 除法 | 5/2 輸出結果 2.5 |
% | 取餘 | B%A 輸出結果 0 |
^ | 乘冪 | A^2 輸出結果 100 |
- | 負號 | -A 輸出結果是 -10 |
// | 整除運算子(>=lua 5.3) | 5//2 輸出結果 2 |
注意:
在 整除運算子 時,例如 5//2,可能會報錯:
lua: a.lua: XXX : unexpected symbol near '/' ---XXX 代表行號
報錯原因時版本的問題。需要 >=lua 5.3。
(2)關係運算子
設定A的值為10,B的值為20.
運算子 | 描述 | 示例 |
== | 等於 | (A==B)為false |
~= | 不等於 | (A~=B) 為true |
> | 大於 | (A>B)為false |
< | 小於 | (A<B)為true |
>= | 大於等於 | (A>=B)為false |
<= | 小於等於 | (A<=B)為true |
(3)邏輯運算子
注意:Lua系統將false 與 nil 作為假,將true 與非nul作為真,即使是0也為真。
設定A的值為true,B的值為false。
運算子 | 描述 | 示例 |
and | 邏輯與 | (A and B) 為false |
or | 邏輯或 | (A or B) 為true |
not | 邏輯非 | not (A and B) 為true |
(4)其它運算子
運算子 | 描述 | 示例 |
.. (兩個點) |
字串連線符 |
a..b,其中a為“Hello”,b為“ World”, 輸出結果為“Hello World”。 |
# | 返回字串或表的長度 | #Hello,輸出結果為5。 |
3.5 函式
Lua中函式的定義是以function開頭,後跟函式名與引數列表,以end結尾。其可以沒有返回值,也可以一次返回多個值。
(1)固定函式
Lua中的函式在呼叫時與Java語言中方法的呼叫是不同的,其不要求實參的個數必須與函式中形參的個數相同。如果實參個數少於形參個數,則系統自動使用nil填充;如果實參個數多於形參個數,多出的將被系統自動忽略。
(2)可變參函式
在函式定義時不給出具體形參的個數,而是使用三個連續的點號。在函式呼叫時就可以向該函式傳遞任意個數的引數,函式可以全部接收。
(3)可返回多個值
Lua 中的函式一次可以返回多個值,但需要有多個變數來同時接收。
(4)函式作為引數
Lua的函式中,允許函式作為引數。而作為引數的函式,可以是已經定義好的普通函式,也可以是匿名函式。
3.6 流程控制語句
Lua提供了if作為流程控制語句
(1)if 語句
Lua 提供了if ... then 用於表示條件判斷,其中if的判斷條件可以是任意表示式。 Lua系統將false 與 nil 作為假,將true 與 非 nil 作為真,即使是0也是真。
需要注意,Lua中的if語句的判斷條件可以使用小括號括起來,也可以不使用。
(2)if 巢狀語句
Lua中提供了專門的關鍵字elseif來做if巢狀語句。
注意,不能使用else 與 if 兩個關鍵字的聯用形式,即不能使用else if 來巢狀if語句。
3.7 迴圈控制語句
(1)While ... do
只要while 中的條件成立就一直迴圈。
(2)repeat ... until
until 中的條件成立了,迴圈就要停止了。
(3)數值for
這種for迴圈只,用於迴圈變數為數值型的情況。其語法格式為:
for var=exp1,exp2,exp3 do
exp2,為條件(exp2>=exp1);
exp3 ,為步長,省略不寫時,預設為1。
(4)泛型for
泛型for用於遍歷table中的所有值,其需要與Lua的迭代器聯合使用。
(5)break
break語句可以提前終止迴圈。其只能用於迴圈之中。
(6)goto
goto語句可以將執行流程無條件地跳轉到指定的標記語句處開始執行,注意,是開始執行,並非僅執行這一句,而是從這句開始後面的語句都會重新執行。當然,該標識語句在第一次經過時也會執行的,並非是必須由goto跳轉時才執行。
語句標識使用一對雙冒號括起來,置於語句前面。goto語句可以在迴圈之外。
注意,Lua5.1 中不支援雙冒號的語句標記。
4 語法進階
4.1 table
(1)陣列
使用table 可以定義一維、二維、多維陣列。不過,需要注意,Lua中的陣列索引是從1開始的,且不需宣告陣列長度,可以隨時增加元素。當然。同一陣列中的元素可以是任意型別。
(2)map
使用map也可以定義出類似map的key-value資料結構。其可以定義table時直接指定key-value,也可單獨指定key-value。而訪問時,一般都是透過table的key直接訪問,也可以陣列索引方式來訪問,此時的key即為索引。
(3)混合結構
Lua允許將陣列與key-value混合在同一個table中進行定義。key-value不會佔用陣列的數字索引值。
(4)table 操作函式
Lua 中提供了對table進行操作的函式。
table.concat ()
【函式】table.concat (list [, sep [, start [, end]]])
【解析】該函式用於將指定的table陣列進行字串連線。連線從start索引位置到end索引位置的所有陣列元素,元素間使用指定的分隔符sep隔開。如果table是一個混合結構,那麼這個連線與key-value無關,僅是連線陣列元素。
table.pack()
【函式】table.pack (···)
【解析】打包。該函式的引數是一個可變參,其可將指定的引數打包為一個table返回。這個返回的table中具有一個屬性n,用於表示該table包含的元素個數。Lua5.1 不支援該函式。
table.unpack()
【函式】table.unpack (list [, i [, j]])
【解析】拆包。該函式返回指定table的陣列中的從第 i 個元素到第 j 個元素值。 i 與 j是可選的,預設i為1,j為陣列的最後一個元素。Lua5.1 不支援該函式。
table.maxn()
【函式】table.maxn(table)
【解析】該函式返回指定table的陣列中的最大索引值,即陣列包含元素的個數。
table.insert()
【函式】table.insert (list, [pos,] value)
【解析】該函式用於在指定table的陣列部分指定位置pos插入值為value的一個元素。其後的元素會被後移。pos引數可選,預設為陣列部分末尾。
table.remove()
【函式】table.remove (list [, pos])
【解析】該函式用於刪除並返回指定table中陣列部分位於pos位置的元素。其後的元素會被遷移。pos引數可選,預設刪除陣列中的最後一個元素。
table.sort()
【函式】table.sort (table [, fun(a,b)])
【解析】該函式用於對指定table的陣列進行升序排序,也可以按照指定函式fun(a,b)中指定的規則進行排序。fun(a,b)是一個用於比較a與b的函式,a與b分別代表陣列中的兩個相鄰元素。
注意;
- 如果arr中的元素既有字串又有數值型,那麼對其進行排序會報錯。
- 如果陣列中多個元素相同,則其相同的多個元素的排序結果不確定,即這些元素的索引誰排前排後,不確定。
- 如果陣列元素中包含nil,則排序會報錯。
學習筆記--參閱特別宣告
1.【Redis影片從入門到高階】
【https://www.bilibili.com/video/BV1U24y1y7jF?p=11&vd_source=0e347fbc6c2b049143afaa5a15abfc1c】