目錄
[TOC]
1 簡介
Lua是C語言
開發(fā)的輕量腳本語言
雀鹃,以源代碼
形式開放檬洞。
設(shè)計的目的是聚霜,嵌入到應(yīng)用程序中
,為應(yīng)用程序提供靈活的擴(kuò)展
和定制
功能嘶卧。
官網(wǎng):
中文參考手冊:
https://www.runoob.com/manual/lua53doc/contents.html
2 安裝
2.1 網(wǎng)頁運(yùn)行地址
官方demo地址尔觉,這在網(wǎng)頁運(yùn)行腳本:
https://www.lua.org/cgi-bin/demo
2.2 linux安裝
- 安裝依賴
yum install libtermcap-devel ncurses-devel libevent-devel readline-devel
- 下載編譯安裝
#下載
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
#解壓
tar -xzvf lua-5.3.5.tar.gz
#切換目錄
cd lua-5.3.5
#編譯
make linux
#安裝
make linux install
-
校驗
-
查看明了文件
/usr/local/bin目錄下會出現(xiàn)執(zhí)行文件:lua、luac芥吟。
-
查看當(dāng)前版本
[root@localhost /]# lua -v Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
-
簡單命令測試
[root@localhost /]# lua Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio > print('hello world') hello world >
-
2.3 windows安裝
2.3.1 安裝LuaForWindows
- 下載地址
https://github.com/rjpcomputing/luaforwindows/releases
-
配置SciTE
-
代碼提示
Options->Open User Options File侦铜,增加如下配置:
# 增加代碼提示功能( 當(dāng)按下句點(diǎn) '.'专甩, 以及字母鍵的時候, 彈出自動完成提示钉稍。) autocomplete.*.start.characters=.$(chars.alpha)
-
-
支持中文
#支持中文字符++++++++++++++++++++++++++++ #支持中文 963表示簡體中文 code.page=936 output.code.page=936 #不啟用的話涤躲,在輸出區(qū)中文可能會亂碼 character.set=134
2.3.2 Idea安裝插件
idea選擇插件EmmyLua
,進(jìn)行安裝贡未。
新建項目時种樱,項目類型選擇Lua
。
2 編程方式
代碼不需要以;結(jié)尾
俊卤,區(qū)分大小寫嫩挤。
-
交互式編程
可通過lua控制臺,輸入程序消恍,查看結(jié)果岂昭。
-
腳本式編程
編寫lua腳本*.lua,執(zhí)行腳本查看結(jié)果狠怨。
3 注釋
3.1單行注釋
-- 單行注釋
3.2 多行注釋
--[[
多行注釋1
多行注釋2
]]
3 數(shù)據(jù)類型
8種數(shù)據(jù)類型约啊,通過關(guān)鍵字type
可查看數(shù)據(jù)類型。
function fun1()
-- function body
end
print(type(123),type('tom'),type({}),type(fun1));
執(zhí)行結(jié)果:
number string table function
3.1 nil
nil表示空佣赖,沒有值恰矩。if判斷中nil和false都屬于false
,0為true
憎蛤。
使用未定義的變量時外傅,結(jié)果為nil,刪除變量時蹂午,也通過賦值為nil實(shí)現(xiàn)栏豺。
3.2 boolean
布爾類型彬碱,有兩個值豆胸,true和false。
3.3 string
字符串類型巷疼,可用單引號或雙引號
表示字符串晚胡。
字符串拼接使用..
,如下:
print('123'..'456')
執(zhí)行結(jié)果為:
123456
3.4 number
雙精度浮點(diǎn)數(shù)嚼沿,8個字節(jié)估盘。
3.4.1 隱式轉(zhuǎn)換
通過運(yùn)算,string轉(zhuǎn)換number
字符類型的變量執(zhí)行數(shù)字運(yùn)算骡尽,如字符串中的內(nèi)容均為數(shù)字遣妥,則執(zhí)行結(jié)果的類型為number
,如下:
a,b='123','456'
c=a+b
print(c)
print(type(a),type(b),type(c))
執(zhí)行結(jié)果:
579
string string number
如字符串執(zhí)行數(shù)字運(yùn)算攀细,字符串中的內(nèi)容不為數(shù)字箫踩,則執(zhí)行報錯
a,b='123','abc'
c=a+b
print(c)
print(type(a),type(b),type(c))
執(zhí)行結(jié)果:
lua.exe: test1.lua:2: attempt to perform arithmetic on global 'b' (a string value)
stack traceback:
test1.lua:2: in main chunk
3.5 table
table(表)爱态,是lua中靈活的數(shù)據(jù)結(jié)構(gòu),可以用來創(chuàng)建自己的數(shù)據(jù)結(jié)構(gòu)境钟,類似于java中的map锦担。table有類似map的key和map。
3.5.1 初始化
同一個table中慨削,key既可以為數(shù)字洞渔,也可以為字符串,value可以為任意類型
缚态。
-
構(gòu)建list
tab={'tom','jack'} for k,v in pairs(tab) do print(type(k),type(v),k,v) end
結(jié)果如下:
number string 1 tom
number string 2 jack -
構(gòu)建map
tab={name='tom',age=18} for k,v in pairs(tab) do print(type(k),type(v),k,v) end
結(jié)果如下:
string string name tom
string number age 18 -
混合構(gòu)建
tab={'tom',name='zhangsan','jack',age=14} for k,v in pairs(tab) do print(type(k),type(v),k,v) end
number string 1 tom
number string 2 jack
string string name zhangsan
string number age 14
3.5.2 設(shè)置獲取值
table中代表列表key索引值從1開始磁椒,而不是從0開始
。
key只能為數(shù)字或字符串玫芦。如table為tab1衷快,
當(dāng)key為數(shù)字時,獲取key對應(yīng)的內(nèi)容為:tab[1]
姨俩,設(shè)置key的值為:tab[1]=xxx
蘸拔;
當(dāng)key為數(shù)字或字符串時,獲取key對應(yīng)的內(nèi)容為tab['myKey']
环葵、tab.myKey
调窍,設(shè)置key的值為:tab['myKey']=xxx
、tab.myKey=xxx
3.6 function
3.6.1 格式
格式:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
參數(shù)說明:
optional_function_scope: 該參數(shù)是可選的制定函數(shù)是全局函數(shù)還是局部函數(shù)张遭,未設(shè)置該參數(shù)默認(rèn)為全局函數(shù)邓萨,如果你需要設(shè)置函數(shù)為局部函數(shù)需要使用關(guān)鍵字 local。
function_name: 指定函數(shù)名稱菊卷。
argument1, argument2, argument3..., argumentn: 函數(shù)參數(shù)缔恳,多個參數(shù)以逗號隔開,函數(shù)也可以不帶參數(shù)洁闰。
function_body: 函數(shù)體歉甚,函數(shù)中需要執(zhí)行的代碼語句塊。
result_params_comma_separated: 函數(shù)返回值扑眉,Lua語言函數(shù)可以返回多個值纸泄,每個值以逗號隔開。
舉例:
function funTest()
-- function body
end
3.6.2 參數(shù)
參數(shù)可以為定長參數(shù)腰素,也可以為變長參數(shù)聘裁。
-
定長參數(shù)
function funTest(name,age) print(name,age) end funTest('tom',14)
輸出結(jié)果:
tom 14
-
變長參數(shù)
變長參數(shù),函數(shù)定義時用
...
來表示弓千。函數(shù)內(nèi)部衡便,通過
{...}
獲取變長參數(shù),獲取的結(jié)果類型為table
。函數(shù)內(nèi)部镣陕,可以通過
select
關(guān)鍵字獲取可變參數(shù)的相關(guān)信息征唬。select('#'...)
表示獲取可變參數(shù)的長度;select(n,...)表示獲取第n個
到第select('#',...)
個的參數(shù)結(jié)果
茁彭,獲取的內(nèi)容為一組返回值总寒,獲取的類似function返回的多個值
,而不是table理肺。 -
舉例:
--定義函數(shù) function funTest(...) print('[參數(shù)類型]:'..type({...})) print('[參數(shù)個數(shù)]:'..select('#',...)) for v,k in pairs({...}) do print(v,k) end print('[select循環(huán)參數(shù)]:') for i=1,select('#',...) do local val=select(i,...) print(i,val) end end --調(diào)用函數(shù) funTest('tom',14,'remark')
輸出結(jié)果:
[參數(shù)類型]:table
[參數(shù)個數(shù)]:3
1 tom
2 14
3 remark
[select循環(huán)參數(shù)]:
1 tom
2 14
3 remark
3.6.3 返回值
函數(shù)可以有多個返回值
摄闸,如下:
--定義函數(shù)
function funTest()
return 'tom',14,'remark'
end
--調(diào)用函數(shù)
a,b,c,d=funTest();
print(a,b,c)
執(zhí)行結(jié)果:
tom 14 remark
3.6.4 First-Class Value
第一函數(shù)值,函數(shù)名和變量名之間沒有區(qū)別妹萨,他們之間可以互相賦值
年枕。
function fun1()
print("fun1")
end
a=123
print(a)
a=fun1
print(a
執(zhí)行結(jié)果:
123
function: 00C6BC40
3.6.5 匿名函數(shù)
函數(shù)支持匿名函數(shù),類似java中的匿名函數(shù)乎完。
function fun1(name,printFun)
printFun(name)
end
fun1("tom",function(myName)
print(myName .. ' is call')
end)
執(zhí)行結(jié)果:
tom is call
3.7 thread
線程相關(guān)熏兄,待完善。
3.8 userdata
C語言結(jié)構(gòu)相關(guān)树姨,待完善摩桶。
4 變量
4.1 作用范圍
默認(rèn)情況下,所有變量均為全局變量
帽揪,如將變成設(shè)置為局部變量硝清,變量前需加local
關(guān)鍵字,如下:
local userName='tom'
4.2 命名規(guī)則
- 變量命名转晰,可以有字母芦拿、數(shù)字。下劃線
- 只可以以字母查邢、下劃線開頭定義變量蔗崎。不可以以數(shù)字開頭,不建議以
_
+大寫字母
開頭扰藕,否則容易和lua內(nèi)部變量沖突(lua內(nèi)部變量采用此命名規(guī)則) - 不可以用關(guān)鍵字作為變量
4.3 類型
變量類型可以根據(jù)變量的值確定
缓苛。同一個變量多次賦值不同類型的數(shù)據(jù)后,變量類型發(fā)生變化实胸。
執(zhí)行代碼:
a='tom'
print(a)
a=123
print(a)
執(zhí)行結(jié)果:
tom
123
4.4 賦值
-
為多個參數(shù)賦值
可以一次性給多個參數(shù)賦值。類似
prarm1,param2,parma3=value1,value2,value3
會依次將=號右邊的值
按照順序依次
賦值給左邊的變量庐完。=號``兩側(cè)的數(shù)量可以不一致
,當(dāng)變量個數(shù)比值的個數(shù)多時徘熔,后面多余的變量自動賦值為nil(相當(dāng)于沒有定義該變量
)门躯,當(dāng)變量的個數(shù)比值的個數(shù)少的時候,多余的賦值酷师,將忽略讶凉。 -
執(zhí)行順序
lua中對參數(shù)賦值時染乌,先將=號右面的內(nèi)容計算完畢后,再賦值給左邊懂讯。
因此荷憋,交換變量內(nèi)容時,可以寫作:
a,b=123,456 print(a,b) a,b=b,a print(a,b)
執(zhí)行結(jié)果:
123 456
456 123
4.5 刪除
獲取沒有定義的變量褐望,內(nèi)容為nil勒庄。變量直接賦值為nil,則將變量刪除瘫里。
如果給變量賦值為nil实蔽,和變量未初始化,效果一樣谨读。
執(zhí)行代碼:
-- 調(diào)用未定義的變量
print(a)
-- 變量賦值
a='tom'
print(a)
-- 刪除變量
a=nil
print(a)
執(zhí)行結(jié)果:
nil
tom
nil
4.6 值傳遞/引用傳遞
值傳遞
:變量之間賦值局装,將老變量的內(nèi)容拷貝了一份給新的變量。新的變量更改內(nèi)容不影響老的變量劳殖。
引用傳遞
: 變量之間的賦值铐尚,將老的變量對內(nèi)容的引用傳遞給信的變量,新老變量對應(yīng)的內(nèi)容內(nèi)存地址一致哆姻,新的變量和老的變量更改內(nèi)容塑径,均會影響對方。
lua變量賦值填具,table為引用傳遞统舀,其他均為值傳遞
。
-
值傳遞
a=123 b=a b=456 print(a,b)
執(zhí)行結(jié)果:
123 456
-
引用傳遞
function printTable(tab) for k,v in pairs(tab) do print(k,v); end end a={name="tom",age="18"} b=a printTable(a) printTable(b) b.name='jerry' print('===============after change===============') printTable(a) printTable(b)
執(zhí)行結(jié)果:
name tom
age 18
name tom
age 18
===============after change===============
name jerry
age 18
name jerry
age 18
5 流程
5.1 循環(huán)
5.1.1 for循環(huán)
-
數(shù)值for循環(huán)
數(shù)值for循環(huán)劳景,根據(jù)條件判斷指定的循環(huán)次數(shù)誉简,每次循環(huán)執(zhí)行對應(yīng)循環(huán)體。
主要用來指定循環(huán)次數(shù)盟广,exp1闷串,exp2如果為公式,只執(zhí)行一次筋量。
- 格式
for var=exp1,exp2,exp3 do -- <執(zhí)行體> end
var 從exp1變化到exp2烹吵,中間每次變化的步長為exp3。exp3可以省略桨武,默認(rèn)為1肋拔。
- 具體
-
泛型for循環(huán)
泛型for循環(huán),主要用來遍歷table呀酸。
格式:
for k,v in pairs(table1) do -- <執(zhí)行體> end
其中凉蜂,k為table的鍵,v為table的值。
循環(huán)會過濾掉值為nil的key(table中key對應(yīng)的值為nil窿吩,表示key不存在)
茎杂,如下:function printTable(tab) for k,v in pairs(tab) do print(k,v); end end tab1={name="tom",remark=nil,age=18,other=nil} printTable(tab1)
執(zhí)行結(jié)果如下,會忽略掉值為nil的鍵纫雁,remark和other:
age 18
name tom
5.1.2 while循環(huán)
-
格式
while(condition) do -- <執(zhí)行體> end
根據(jù)條件condition判斷是否執(zhí)行煌往。
5.2 if判斷
? if條件判斷,可以進(jìn)行嵌套
轧邪。
-
if語句
if(布爾表達(dá)式) then --[ 在布爾表達(dá)式為 true 時執(zhí)行的語句 --] end
-
if...else語句
if(布爾表達(dá)式) then --[ 布爾表達(dá)式為 true 時執(zhí)行該語句塊 --] else --[ 布爾表達(dá)式為 false 時執(zhí)行該語句塊 --] end
-
if...
elseif
...else 語句if( 布爾表達(dá)式 1) then --[ 在布爾表達(dá)式 1 為 true 時執(zhí)行該語句塊 --] elseif( 布爾表達(dá)式 2) then --[ 在布爾表達(dá)式 2 為 true 時執(zhí)行該語句塊 --] elseif( 布爾表達(dá)式 3) then --[ 在布爾表達(dá)式 3 為 true 時執(zhí)行該語句塊 --] else --[ 如果以上布爾表達(dá)式都不為 true 則執(zhí)行該語句塊 --] end
6 模塊
6.1 用途
6.2 舉例
定義文件myModule.lua
:
-- 定義私有表
local myModule={name='tom'}
local function getResult(param)
-- 私有方法
return myModule.name .. ' say:' .. param
end
function myModule:say(param)
-- 公有方法
print(getResult(param))
end
-- 返回表
return myModule
調(diào)用:
myModule=require('myModule')
myModule:say('hello')
執(zhí)行結(jié)果:
tom say:hello
6.3 加載機(jī)制
...