一、前言
Lua 是一種輕量小巧的腳本語言,用標準 C 語言編寫并以源代碼形式開放,其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。
Lua 可以應用在游戲開發、獨立應用腳本、Web 應用腳本、擴展和數據庫插件、安全系統等場景。
筆者學習的目的主要是為了能在 Web 應用(Nginx、Redis)中使用到 Lua 腳本。
特點
特性
二、安裝
注意:請確保安裝 Lua 之前系統已安裝 readline 和 readline-devel。如果沒有則鍵入 yum install -y readline readline-devel
進行安裝。
curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gztar zxf lua-5.3.4.tar.gzcd lua-5.3.4make linux test
測試,命令行中鍵入 lua -v:
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
顯示 Lua 版本說明安裝正確。
三、運行方式
與其他腳本語言一樣,我們需要將 Lua 代碼編寫在文件中,后綴名為 .lua。
運行該文件的代碼時,只需在命令行鍵入 lua xx.lua 即可。
四、語法
4.1 數據類型
Lua 中包含 8 種基本數據類型,即:nil、boolean、number、string、userdata、function、thread 和 table。
數據類型 | 說明 |
---|---|
nil | 表示無效值,在條件表達式中表示 false。 |
boolean | 布爾值,包含 true 和 false 兩個值。 |
number | 表示雙精度類型的實浮點數。 |
string | 表示字符串,通過雙引號或單引號括住。 |
userdata | 表示任意存儲在變量中的 C 數據結構 |
function | 表示 C 或 Lua 編寫的函數 |
thread | 表示執行的獨立線程,用于執行協同程序。 |
table | 表示一個關聯數組,數組索引可以是數字或字符串。 |
例如:
a=10str="hello world"
不需要聲明變量類型,我們可以通過 type() 判斷變量類型。
注意:
Lua 變量有三種類型:全局變量、局部變量和表中的域;
默認情況下,不管在哪聲明的變量都是全局變量。通過 local 修飾的變量為局部變量;
變量默認值為 nil。
4.2 運算符
1) 賦值運算符
str="hello".."world" -- 通過 .. 連接字符串a,b=10,15 -- a=10,b=15c,d,e=1,2 -- c=1,b=2,e=nil
2) 算術運算符
與其他程序設計語言類似。
a,b=10,15c=a+b -- 加號d=a-b -- 減號e=a*b -- 乘號f=a/b -- 除號g=a%b -- 求余h=a^2 -- 求乘方i=-a -- 負號
3) 關系運算符
與其他程序設計語言類似。
a,b=10,15print(a>b) -- 大于print(a<b) -- 小于print(a==b) -- 等于print(a~=b) -- 不等于
4) 邏輯運算符
print(true and false) -- 與print(true or false) -- 或print(not true) -- 非
5) 其他運算符
操作符 | 說明 |
---|---|
.. | 連接兩個字符串 |
# | 返回字符串或表的長度,如 #“lua” |
4.3 流程控制
1) 條件判斷,有 3 種寫法。
-- if 語句if(true)then print("hello")end-- if .. else 語句a,b=10,15if(a>b)then print(a)else print(b)end-- if 嵌套c=20if(c>10)then if(c<30) then print(c) endend
2) 循環,有 4 種寫法。
類型 | 說明 |
---|---|
while 循環 | 在條件為 true 時,讓程序重復執行語句。 |
for 循環 | 重復執行指定語句,重復次數在 for 中控制??梢员闅v數字和泛型。 |
repeat .. until | 重復執行循環,直到指定條件為真為止。 |
循環嵌套 | 循環內嵌套多個循環語句。 |
例如:
-- while 循環a=10while(a>0)do print(a) a=a-1end-- for 循環,遍歷數字for a=1,10,1 do print(a)end-- repeat .. until 循環a=10repeat print(a) a=a-1until(a<1)
4.4 數組
Lua 數組大小不固定且下標從 1 開始。
arr={"h","e","l","l","o"}-- 此處使用遍歷數字方式for index=1,#arr do print(arr[index])end-- 此處使用遍歷泛型方式for i,v in ipairs(arr) do print(i,v)end
4.5 函數
-- 案例 1function calc(a,b,c) return a+b+cendresult=calc(1,2,3)print(result)-- 案例 2function getCalc(a,b,c) return a,b,cendr1,r2,r3=getCalc(1,2,3)print(r1,r2,r3)
Lua 中的函數允許返回多個值。
4.6 table
table 是 Lua 中的一個數據結構,類似于 Java 中的 Map 類型或 Javascript 中的 JSON 對象。
Lua table 使用關聯數組,我們可以使用任意類型值作為數組的索引,但不能是 nil。
Lua table 大小不固定。
person={}person.name="jack"person.age=20print(person[1])print(person.name)print(person["age"])
4.7 模塊和包
模塊類似于一個封裝庫。從 Lua 5.1 開始,Lua 加入標準的模塊管理機制,可以將一些公用的代碼放在一個文件中,以 API 接口的形式在其他地方調用,有利于代碼的重用和降低代碼耦合。
Lua 的模塊由變量、函數等已知元素組成的 table 。
例如:
創建名為 module.lua 的文件。
module={}module.index=1function module.sum(a,b) return a+bend
另一個文件引入:
-- 此處 module 是文件名require "module"-- 此處 module 是引入模塊中定義的名稱print(module.index)print(module.sum(1,2))
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。
|
新聞熱點
疑難解答