Lua 中的語句支持賦值,控制結構,函數調用,還有變量聲明。html
不容許空的語句段,所以 ;;
是非法的。數組
chunck ::= {stat[';']}
([';']
應該是表示語句組後面 ;
是可選項。)函數
block ::= chunck stat ::= do block end
能夠將一個語句塊顯式地寫成語句組,能夠用於控制局部變量的做用範圍。測試
Lua 支持多重賦值。code
多重賦值時,按序將右邊的表達式的值賦值給左值。右值不足補 nil,右值多餘捨棄。htm
b = 1 a,b = 4 -- a = 4,b = nil
+++blog
Lua 在進行賦值操做時,會一次性把右邊的表達式都計算出來後進行賦值。ip
i = 5 i,a[i] = i+1, 7 -- i = 6 ,a[5] = 7
特別地,有get
x,y = y,x -- 交換 x,y 的值
+++it
對全局變量以及表的域的賦值操做含義能夠在元表中更改。
if [exp] [block] elseif [exp] [block] else [block] end
while [exp] [block] end
+++
repeat [block] until [exp]
注意,因爲 repeat
語句到 until
還未結束,所以在 until
以後的表達式中能夠使用 block
中定義的局部變量。
例如:
a = 1 c = 5 repeat b = a + c c = c * 2 until b > 20 print(c) --> 40
+++
break
和 return
break
和 return
只能寫在語句塊的最後一句,若是實在須要寫在語句塊中間,那麼就在兩個關鍵詞外面包圍 do end
語句塊。
do break end
For
循環for
循環的用法比較多,單獨拎出來說。
for
中的表達式會在循環開始前一次性求值,在循環過程當中再也不更新。
for [Name] = [exp],[exp],[exp] do [block] end
三個 exp 分別表明初值,結束值,步進。exp 的值均須要是一個數字。
第三個 exp 默認爲 1,能夠省略。
a = 0 for i = 1,6,2 do a = a + i end
等價於
int a = 0; for (int i = 1; i <= 6;i += 2){ // 取到等號,若是步進是負的,那麼會取 i >= 6 a += i; }
迭代器形式輸出一個表時,若是表中有函數,則輸出的順序及個數不肯定(筆者測試得出的結果,具體緣由未知)。
迭代器形式的 for 循環的實質
-- 依次返回 迭代器、狀態表、迭代器初始值 function mypairs(t) function iterator(t,i) i = i + 1 i = t[i] and i -- 若是 t[i] == nil 則 i = nil;不然 i = i return i,t[i] end return iterator,t,0 end -- 一個表 t = {[1]="1",[2]="2"} -- 迭代形式 for 語句的 等價形式 do local f, s, var = mypairs(t) while true do local var1, var2 = f(s, var) var = var1 if var == nil then break end -- for 循環中添加的語句 print(var1,var2) end end -- 迭代形式 for 語句 for var1,var2 in mypairs(t) do print(var1,var2) end --> 1 1 --> 2 2 --> 1 1 --> 2 2
ary = {[1]=1,[2]=2,[5]=5} for i,v in ipairs(ary) do print(v) --> 1 2 end
從1開始,直到數值型下標結束或者值爲 nil 時結束。
table = {[1]=1,[2]=2,[5]=5} for k,v in pairs(table) do print(v) --> 1 2 5 end
遍歷整個表的鍵值對。
關於迭代器的更多內容,可參考Lua 迭代器和泛型 for。
Lua迭代器和泛型for(介紹 Lua 迭代器的詳細原理以及使用)