Redis基礎知識(學習筆記21--Lua 指令碼語言)

东山絮柳仔發表於2024-09-04

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】

相關文章