柚子快報激活碼778899分享:Lua腳本
柚子快報激活碼778899分享:Lua腳本
Lua腳本
十一、【Lua】11.1.概念11.2.特性11.2.1.輕量級11.2.2.可擴展11.2.3.支持面向過程編程和函數(shù)式編程
11.3.應用場景11.4.Lua的安裝11.4.1. 點擊download可以找到對應版本的下載地址11.4.2. 編譯安裝11.4.3.如果在執(zhí)行make linux test失敗,報如下錯誤:11.4.4.驗證是否安裝成功
11.5.Lua的語法11.5.1.第一個Lua程序11.5.2.Lua的注釋11.5.3.標識符11.5.4.關鍵字11.5.5.運算符11.5.6.全局變量&局部變量
11.6.Lua數(shù)據(jù)類型11.6.1.Lua有8個數(shù)據(jù)類型11.6.2.nil11.6.3.boolean11.6.4.number11.6.5.string11.6.6.table11.6.7.function11.6.8.thread11.6.9.userdata
11.7.Lua控制結(jié)構(gòu)11.7.1.if then elseif else11.7.2.while循環(huán)11.7.3.repeat循環(huán)11.7.4.for循環(huán)
endl
十一、【Lua】
11.1.概念
Lua是一種輕量、小巧的腳本語言,用標準C語言編寫并以源代碼形式開發(fā)。 設計的目的是為了嵌入到其他應用程序中,從而為應用程序提供靈活的擴展和定制功能。
11.2.特性
跟其他語言進行比較,Lua有其自身的特點:
11.2.1.輕量級
Lua用標準C語言編寫并以源代碼形式開發(fā),編譯后僅僅一百余千字節(jié),可以很方便的嵌入到其他程序中。
11.2.2.可擴展
Lua提供非常豐富易于使用的擴展接口和機制,由宿主語言(通常是C或C++)提供功能,Lua可以使用它們,就像內(nèi)置的功能一樣。
11.2.3.支持面向過程編程和函數(shù)式編程
11.3.應用場景
Lua在不同的系統(tǒng)中得到大量應用,場景的應用場景如下:
游戲開發(fā)、獨立應用腳本、web應用腳本、擴展和數(shù)據(jù)庫插件、系統(tǒng)安全上。
11.4.Lua的安裝
在linux上安裝Lua非常簡單,只需要下載源碼包并在終端解壓、編譯即可使用。
Lua的官網(wǎng)地址為:https://www.lua.org
11.4.1. 點擊download可以找到對應版本的下載地址
使用wget命令直接下載:
mkdir -p /lua/core
cd /lua/core
wget https://www.lua.org/ftp/lua-5.4.6.tar.gz
tar -zxf lua-5.4.6.tar.gz
11.4.2. 編譯安裝
cd lua-5.4.6
# 測試當前Linux環(huán)境是否適合安裝lua
make linux test
make install
#卸載
#make uninstall
11.4.3.如果在執(zhí)行make linux test失敗,報如下錯誤:
說明當前系統(tǒng)缺少libreadline-dev依賴包,需要通過命令來進行安裝
yum install -y readline-devel
11.4.4.驗證是否安裝成功
lua -v
11.5.Lua的語法
Lua和C/C++語法非常相似,整體上比較清晰,簡潔。條件語句、循環(huán)語句、函數(shù)調(diào)用都與C/C++基本一致。
11.5.1.第一個Lua程序
Lua有兩種交互方式,分別是:交互式和腳本式
交互式之HELLOWORLD
交互式是指可以在命令行輸入程序,然后回車就可以看到運行的效果。
Lua交互式編程模式可以通過命令lua -i 或lua來啟用;在命令行中key輸入如下命令,并按回車,會有輸出在控制臺
腳本式之HELLOWORLD
腳本式是將代碼保存到一個以lua為擴展名的文件中并執(zhí)行的方式。
方式一:
我們需要一個文件名為 hello.lua,在文件中添加要執(zhí)行的代碼,然后通過命令 lua hello.lua來執(zhí)行,會在控制臺輸出對應的結(jié)果。
hello.lua
print("Hello World!!")
方式二:
將hello.lua做如下修改
#!/usr/local/bin/lua
print("Hello World!!!")
第一行用來指定Lua解釋器所在位置為 /usr/local/bin/lua,加上#號標記解釋器會忽略它。 一般情況下#!就是用來指定用哪個程序來運行本文件。 但是hello.lua并不是一個可執(zhí)行文件,需要通過chmod來設置可執(zhí)行權限,最簡單的方式為:
chmod 755 hello.lua
然后執(zhí)行該文件
./hello.lua
補充一點,如果想在交互式中運行腳本式的hello.lua中的內(nèi)容,我們可以使用一個dofile函數(shù),如:
dofile("lua_demo/hello.lua")
注意:在Lua語言中,連續(xù)語句之間的分隔符并不是必須的,也就是說后面不需要加分號,當然加上也不會報錯,
在Lua語言中,表達式之間的換行也起不到任何作用。如以下四個寫法,其實都是等效的
寫法一
a=1
b=a+2
寫法二
a=1;
b=a+2;
寫法三
a=1; b=a+2;
寫法四
a=1 b=a+2
不建議使用第四種方式,可讀性太差。
11.5.2.Lua的注釋
關于Lua的注釋要分兩種,第一種是單行注釋,第二種是多行注釋。
單行注釋的語法為:
--注釋內(nèi)容
多行注釋的語法為:
--[[
注釋內(nèi)容
注釋內(nèi)容
--]]
如果想取消多行注釋,只需要在第一個–之前在加一個-即可,如:
---[[
注釋內(nèi)容
注釋內(nèi)容
--]]
11.5.3.標識符
換句話說標識符就是我們的變量名,Lua定義變量名以一個字母 A 到 Z 或 a 到 z 或下劃線 _ 開頭后加上0個或多個字母,下劃線,數(shù)字(0到9)。這塊建議大家最好不要使用下劃線加大寫字母的標識符,因為Lua的保留字也是這樣定義的,容易發(fā)生沖突。注意Lua是區(qū)分大小寫字母的。
A0
11.5.4.關鍵字
下列是Lua的關鍵字,大家在定義常量、變量或其他用戶自定義標識符都要避免使用以下這些關鍵字:
andbreakdoelseelseifendfalseforfunctionifinlocalnilnotorrepeatreturnthentrueuntilwhilegoto
一般約定,以下劃線開頭連接一串大寫字母的名字(比如 _VERSION)被保留用于 Lua 內(nèi)部全局變量。這個也是上面我們不建議這么定義標識符的原因。
11.5.5.運算符
Lua中支持的運算符有算術運算符、關系運算符、邏輯運算符、其他運算符。
算術運算符:
+ 加法
- 減法
* 乘法
/ 除法
% 取余
^ 乘冪
- 負號
例如:
10+20 -->30
20-10 -->10
10*20 -->200
20/10 -->2
3%2 -->1
10^2 -->100
-10 -->-10
關系運算符
== 等于
~= 不等于
>大于
< 小于
>= 大于等于
<= 小于等于
例如:
10==10 -->true
10~=10 -->false
20>10 -->true
20<10 -->false
20>=10 -->true
20<=10 -->false
邏輯運算符
and 邏輯與 A and B &&
or 邏輯或 A or B ||
not 邏輯非 取反,如果為true,則返回false !
邏輯運算符可以作為if的判斷條件,返回的結(jié)果如下:
A = true
B = true
A and B -->true
A or B -->true
not A -->false
A = true
B = false
A and B -->false
A or B -->true
not A -->false
A = false
B = true
A and B -->false
A or B -->true
not A -->true
其他運算符
.. 連接兩個字符串
# 一元預算法,返回字符串或表的長度
例如:
> "HELLO ".."WORLD" -->HELLO WORLD
> #"HELLO" -->5
11.5.6.全局變量&局部變量
在Lua語言中,全局變量無須聲明即可使用。在默認情況下,變量總是認為是全局的,如果未提前賦值,默認為nil: 要想聲明一個局部變量,需要使用local來聲明
11.6.Lua數(shù)據(jù)類型
11.6.1.Lua有8個數(shù)據(jù)類型
nil(空,無效值)
boolean(布爾,true/false)
number(數(shù)值)
string(字符串)
function(函數(shù))
table(表)
thread(線程)
userdata(用戶數(shù)據(jù))
可以使用type函數(shù)測試給定變量或者的類型:
print(type(nil)) -->nil
print(type(true)) --> boolean
print(type(1.1*1.1)) --> number
print(type("Hello world")) --> string
print(type(io.stdin)) -->userdata
print(type(print)) --> function
print(type(type)) -->function
print(type{}) -->table
print(type(type(X))) --> string
11.6.2.nil
nil是一種只有一個nil值的類型,它的作用可以用來與其他所有值進行區(qū)分,也可以當想要移除一個變量時,只需要將該變量名賦值為nil,垃圾回收就會會釋放該變量所占用的內(nèi)存。
11.6.3.boolean
boolean類型具有兩個值,true和false。boolean類型一般被用來做條件判斷的真與假。在Lua語言中,只會將false和nil視為假,其他的都視為真,特別是在條件檢測中0和空字符串都會認為是真,這個和我們熟悉的大多數(shù)語言不太一樣。
11.6.4.number
在Lua5.3版本開始,Lua語言為數(shù)值格式提供了兩種選擇:integer(整型)和float(雙精度浮點型)[和其他語言不太一樣,float不代表單精度類型]。
數(shù)值常量的表示方式:
>4 -->4
>0.4 -->0.4
>4.75e-3 -->0.00475
>4.75e3 -->4750
不管是整型還是雙精度浮點型,使用type()函數(shù)來取其類型,都會返回的是number
>type(3) -->number
>type(3.3) -->number
所以它們之間是可以相互轉(zhuǎn)換的,同時,具有相同算術值的整型值和浮點型值在Lua語言中是相等的
11.6.5.string
Lua語言中的字符串即可以表示單個字符,也可以表示一整本書籍。在Lua語言中,操作100K或者1M個字母組成的字符串的程序很常見。
可以使用單引號或雙引號來聲明字符串
>a = "hello"
>b = 'world'
>print(a) -->hello
>print(b) -->world
如果聲明的字符串比較長或者有多行,則可以使用如下方式進行聲明
html = [[
]]
11.6.6.table
? table是Lua語言中最主要和強大的數(shù)據(jù)結(jié)構(gòu)。使用表, Lua 語言可以以一種簡單、統(tǒng)一且高效的方式表示數(shù)組、集合、記錄和其他很多數(shù)據(jù)結(jié)構(gòu)。 Lua語言中的表本質(zhì)上是一種輔助數(shù)組。這種數(shù)組比Java中的數(shù)組更加靈活,可以使用數(shù)值做索引,也可以使用字符串或其他任意類型的值作索引(除nil外)。
創(chuàng)建表的最簡單方式:
> a = {}
創(chuàng)建數(shù)組:
? 我們都知道數(shù)組就是相同數(shù)據(jù)類型的元素按照一定順序排列的集合,那么使用table如何創(chuàng)建一個數(shù)組呢?
>arr = {"TOM","JERRY","ROSE"}
? 要想獲取數(shù)組中的值,我們可以通過如下內(nèi)容來獲取:
print(arr[0]) nil
print(arr[1]) TOM
print(arr[2]) JERRY
print(arr[3]) ROSE
? 從上面的結(jié)果可以看出來,數(shù)組的下標默認是從1開始的。所以上述創(chuàng)建數(shù)組,也可以通過如下方式來創(chuàng)建
>arr = {}
>arr[1] = "TOM"
>arr[2] = "JERRY"
>arr[3] = "ROSE"
上面我們說過了,表的索引即可以是數(shù)字,也可以是字符串等其他的內(nèi)容,所以我們也可以將索引更改為字符串來創(chuàng)建
>arr = {}
>arr["X"] = 10
>arr["Y"] = 20
>arr["Z"] = 30
當然,如果想要獲取這些數(shù)組中的值,可以使用下面的方式
方式一
>print(arr["X"])
>print(arr["Y"])
>print(arr["Z"])
方式二
>print(arr.X)
>print(arr.Y)
>print(arr.Z)
當前table的靈活不進于此,還有更靈活的聲明方式
>arr = {"TOM",X=10,"JERRY",Y=20,"ROSE",Z=30}
如何獲取上面的值?
TOM : arr[1]
10 : arr["X"] | arr.X
JERRY: arr[2]
20 : arr["Y"] | arr.Y
ROESE: arr[3]
11.6.7.function
在 Lua語言中,函數(shù)( Function )是對語句和表達式進行抽象的主要方式。
定義函數(shù)的語法為:
function functionName(params)
end
函數(shù)被調(diào)用的時候,傳入的參數(shù)個數(shù)與定義函數(shù)時使用的參數(shù)個數(shù)不一致的時候,Lua 語言會通過 拋棄多余參數(shù)和將不足的參數(shù)設為 nil 的方式來調(diào)整參數(shù)的個數(shù)。
function f(a,b)
print(a,b)
end
f() --> nil nil
f(2) --> 2 nil
f(2,6) --> 2 6
f(2.6.8) --> 2 6 (8被丟棄)
可變長參數(shù)函數(shù)
function add(...)
a,b,c=...
print(a)
print(b)
print(c)
end
add(1,2,3) --> 1 2 3
函數(shù)返回值可以有多個,這點和Java不太一樣
function f(a,b)
return a,b
end
x,y=f(11,22) --> x=11,y=22
11.6.8.thread
thread翻譯過來是線程的意思,在Lua中,thread用來表示執(zhí)行的獨立線路,用來執(zhí)行協(xié)同程序。
11.6.9.userdata
userdata是一種用戶自定義數(shù)據(jù),用于表示一種由應用程序或C/C++語言庫所創(chuàng)建的類型。
11.7.Lua控制結(jié)構(gòu)
Lua 語言提供了一組精簡且常用的控制結(jié)構(gòu),包括用于條件執(zhí)行的證 以及用于循環(huán)的 while、 repeat 和 for。 所有的控制結(jié)構(gòu)語法上都有一個顯式的終結(jié)符: end 用于終結(jié) if、 for 及 while 結(jié)構(gòu), until 用于終結(jié) repeat 結(jié)構(gòu)。
11.7.1.if then elseif else
if語句先測試其條件,并根據(jù)條件是否滿足執(zhí)行相應的 then 部分或 else 部分。 else 部分 是可選的。
function testif(a)
if a>0 then
print("a是正數(shù)")
end
end
function testif(a)
if a>0 then
print("a是正數(shù)")
else
print("a是負數(shù)")
end
end
如果要編寫嵌套的 if 語句,可以使用 elseif。 它類似于在 else 后面緊跟一個if。根據(jù)傳入的年齡返回不同的結(jié)果,如
age<=18 青少年,
age>18 , age <=45 青年
age>45 , age<=60 中年人
age>60 老年人
function show(age)
if age <= 18 then return "青少年"
elseif age > 18 and age <= 45 then return "青年"
elseif age > 45 and age <= 60 then return "中年人"
else return "老年人"
end
end
11.7.2.while循環(huán)
顧名思義,當條件為真時 while 循環(huán)會重復執(zhí)行其循環(huán)體。 Lua 語言先測試 while 語句 的條件,若條件為假則循環(huán)結(jié)束;否則, Lua 會執(zhí)行循環(huán)體并不斷地重復這個過程。
語法:
while 條件 do
循環(huán)體
end
例子:實現(xiàn)數(shù)組的循環(huán)
function testWhile()
local i = 1
while i<=10 do
print(i)
i=i+1
end
end
11.7.3.repeat循環(huán)
repeat-until語句會重復執(zhí)行其循環(huán)體直到條件為真時結(jié)束。 由于條件測試在循環(huán)體之后執(zhí)行,所以循環(huán)體至少會執(zhí)行一次。
語法
repeat
循環(huán)體
until 條件
function testRepeat()
local i = 10
repeat
print(i)
i=i-1
until i < 1
end
11.7.4.for循環(huán)
數(shù)值型for循環(huán)
語法
for param=exp1,exp2,exp3 do
循環(huán)體
end
param的值從exp1變化到exp2之前的每次循環(huán)會執(zhí)行 循環(huán)體,并在每次循環(huán)結(jié)束后將步長(step)exp3增加到param上。exp3可選,如果不設置默認為1
for i = 1,100,10 do
print(i)
end
泛型for循環(huán)
泛型for循環(huán)通過一個迭代器函數(shù)來遍歷所有值,類似于java中的foreach語句。
語法
for i,v in ipairs(x) do
循環(huán)體
end
i是數(shù)組索引值,v是對應索引的數(shù)組元素值,ipairs是Lua提供的一個迭代器函數(shù),用來迭代數(shù)組,x是要遍歷的數(shù)組。
例如:
arr = {"TOME","JERRY","ROWS","LUCY"}
for i,v in ipairs(arr) do
print(i,v)
end
上述實例輸出的結(jié)果為
1 TOM
2 JERRY
3 ROWS
4 LUCY
但是如果將arr的值進行修改為
arr = {"TOME","JERRY","ROWS",x="JACK","LUCY"}
同樣的代碼在執(zhí)行的時候,就只能看到和之前一樣的結(jié)果,而其中的x為JACK就無法遍歷出來,缺失了數(shù)據(jù),如果解決呢?
我們可以將迭代器函數(shù)變成pairs,如
for i,v in pairs(arr) do
print(i,v)
end
上述實例就輸出的結(jié)果為
1 TOM
2 JERRY
3 ROWS
4 LUCY
x JACK
endl
柚子快報激活碼778899分享:Lua腳本
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權,聯(lián)系刪除。