1. 程式人生 > >esp8266學習筆記②:LUA指令碼語言的學習

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