esp8266學習筆記②:LUA指令碼語言的學習
一、LUA語言
Lua 是一種輕量小巧的指令碼語言,用標準C語言編寫並以原始碼形式開放, 其設計目的是為了嵌入應用程式中,從而為應用程式提供靈活的擴充套件和定製功能。
二、Lua 特性
1.輕量級: 它用標準C語言編寫並以原始碼形式開放,編譯後僅僅一百餘K,可以很方便的嵌入別的程式裡。
2.可擴充套件: Lua提供了非常易於使用的擴充套件介面和機制:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內建的功能一樣。
三、LUA的基本語法
相較於c語言來說在,lua在每行程式末尾不帶 “;”
而且不能使用i++ , i--, ++i, --i
單行註釋用
--
而不是/
多行註釋用
--[[ ]]--
而不是/... .../
與——and
或——or
非——not
不等於—— ~=
關鍵詞
以下列出了 Lua 的保留關鍵字。保留關鍵字不能作為常量或變數或其他使用者自定義標示符:
and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while
全域性變數
預設情況下,定義的就是全域性變數
例:a=1
區域性變數
在變數前加 local
例:local a=1
資料型別
nil(空)——這個最簡單,只有值nil屬於該類,表示一個無效值(在條件表示式中相當於false)。 boolean(布林)——包含兩個值:false和true。 number(數字)——表示雙精度型別的實浮點數 string(字串)——字串由一對雙引號或單引號來表示 function(函式)——由 C 或 Lua 編寫的函式 userdata(自定義型別)——表示任意儲存在變數中的C資料結構 thread(執行緒)——表示執行的獨立線路,用於執行協同程式 table(陣列)——Lua 中的表(table)其實是一個"關聯陣列"(associative arrays),陣列的索引可以是數字或者是字串。在 Lua 裡,table 的建立是通過"構造表示式"來完成,最簡單構造表示式是{},用來建立一個空表。
if語句
if (布林表示式) then
--執行語句
end
示例:
a=7
if a<8 then
print("a小於8")
end
輸出結果:a小於8
if…else…語句
if (布林表示式) then
--[ 布林表示式為 true 時執行該語句塊 --]
else
--[ 布林表示式為 false 時執行該語句塊 --]
end
示例:
a = 100 --定義變數
if( a < 20 ) then
--[ if 條件為 true 時執行該語句塊 --]
print("a 小於 20" )
else
--[ if 條件為 false 時執行該語句塊 --]
print("a 大於 20" )
end
print("a 的值為 :", a)
輸出結果:a大於20
a的值為: 100
if巢狀
if( 布林表示式 1) then
--[ 布林表示式 1 為 true 時執行該語句塊 --]
elseif(布林表示式 2) then
--[ 布林表示式 2 為 true 時執行該語句塊 --]
end
end
示例:
a = 100
b = 200
if( a == 100 ) then
elseif( b == 200 ) then
print("a 的值為 100 b 的值為 200" )
end
end
print("a 的值為 :", a )
print("b 的值為 :", b )
輸出結果:
a的值為100b的值為200
a的值為:100
b的值為:200
while迴圈
while(條件判斷) do
迴圈體語句
end
條件判斷結果為布林表示式。即 fasle 或 true
示例:
a=10
while( a < 20 )
do
print("a 的值為:", a)
a = a+1
end
輸出結果:
a 的值為: 10
a 的值為: 11
a 的值為: 12
a 的值為: 13
a 的值為: 14
a 的值為: 15
a 的值為: 16
a 的值為: 17
a 的值為: 18
a 的值為: 19
for迴圈
for var=exp1,exp2,exp3 do
--執行語句
end
---exp1為初始值;exp2為終值;exp3為遞增值,省略則預設為1
示例
for i=1,5,1 do
print("a的值為",i)
end
輸出結果:
a的值為:1
a的值為:2
a的值為:3
a的值為:4
a的值為:5
函式function
function 函式名(引數1,引數2,引數3)
--執行語句
return 返回值1,返回值2,返回值3
end
示例
function max(a,b)
if(a>b) then
result = a
else
result = b
end
return result
end
print("最大值為",max(5,8))
輸出結果:
最大值為:8
陣列定義
array1={} --定義一個空陣列
array2={1,2,3,4,5,6} --定義一個帶值的陣列
--陣列的使用
--一維陣列
a={1,2,3,4,5,6}
print(a[3])
輸出結果:3
--多維陣列
array={}
for i=1,2 then
for j=1,2 then
array[i][j]=i*j
end
end
print(array[1][2])
輸出結果:2
備註:上面得到的是一個二維陣列array[2][2]={1,2;2,4}
錯誤處理
錯誤分為語法錯誤
和執行錯誤
語法錯誤
比執行錯誤
更好查詢
--語法錯誤示例
a == 2
執行結果:
lua: test.lua:2: syntax error near '=='
執行錯誤
是程式可以正常執行,但是會輸出報錯資訊。如下例項由於引數輸入錯誤,程式執行時報錯:
function add(a,b)
return a+b
end
add(10)
當我們編譯執行以下程式碼時,編譯是可以成功的,但在執行的時候會產生如下錯誤:
lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value)
stack traceback:
test2.lua:2: in function 'add'
test2.lua:5: in main chunk
[C]: ?
以下報錯資訊是由於程式缺少 b 引數引起的。
錯誤查詢
pcall(function,x1,x2,x3)
第一個引數為一個函式的名字,注意沒有(),後面的引數為需要給函式傳遞的引數;
函式的第一個返回值表示是否執行成功,成功為ture,不成功為false,
若所傳遞的函式也有返回值,則在pcall返回的第二個值之後接收。
字串
字串或串(String)是由數字、字母、下劃線組成的一串字元。
Lua 語言中字串可以使用以下三種方式來表示:
單引號間的一串字元。
雙引號間的一串字元。
[[和]]間的一串字元。
以上三種方式的字串例項如下:
string1 = "Lua"
print("\"字串 1 是\"",string1)
string2 = 'LUa'
print("字串 2 是",string2)
string3 = [["LUA 教程"]]
print("字串 3 是",string3)
以上程式碼執行輸出結果為:
"字串 1 是" Lua
字串 2 是 LUa
字串 3 是 "LUA 教程"
操作字串
string.upper(字串)
——字串全部轉為大寫字母
string.lower(字串)
——字串全部轉為小寫字母
示例:
s="qaZWSxedc"
t1=string.upper(s)
t2=string.lower(s)
print(t1)
print(t2)
輸出結果:
QAZWSXEDC
qazwsxedc
string.gsub(要替換的字串,被替換的字元,要替換的字元,替換次數)
——在字串中替換
示例:
string.gsub("aaaa","a","z",3);
zzza 3
string.find (字串, 查詢的字元, [init, [end]])
——在一個指定的目標字串中搜索指定的內容(第三個引數為索引),返回其具體位置。不存在則返回 nil。
示例1:
string.find("Hello Lua user", "Lua", 1)
7 9
示例2:
s1="asdfg"
i,j=string.find(s1,'df')
print("i="..i)
print("j="..j)
輸出結果:
i=3
j=4
string.reverse(arg)
——字串反轉
示例:
string.reverse("Lua")
auL
string.char(arg)
和 string.byte(arg[,int])
——char 將整型數字轉成字元並連線, byte 轉換字元為整數值(可以指定某個字元,預設第一個字元)。
示例:
string.char(97,98,99,100)
abcd
string.byte("ABCD",4)
68
string.byte("ABCD")
65
string.len(arg)
——計算字串長度
示例:
string.len("abc")
3
..
——連結兩個字串
示例:
print("abc".."def")
abcdef
string.sub(str,i,j)
——提取字串,提取str
中的第i
到第j
個字元
示例:
s1="abcdefghijk"
t=string.sub(s1,3,7)
print(“提取的字元為:”..t)
輸出結果:
提取的字元為:cdefg