Lua提供了一組傳統、小巧的控制結構:if、while、repeat和for。全部的控制結構都有一個顯示的終止符:if、for和while以end做爲結尾,repeat以until作爲結尾。控制結構中的條件表達式能夠是任何值,Lua將全部不是false和nil的值都「視」爲真。數組
if then else函數
if 語句先測試其條件,而後根據測試結果執行then部分或else部分。else部分是可選的。測試
if a < 0 then a = 0 end if a < b then return a else return b end
若要編寫嵌套的if,可使用elseif。相似於在else後面緊跟着一個if,它還能夠避免在這樣的嵌套中出現多個end。lua
if op == "+" then r = a + b elseif op == "-" then r = a - b ..... else print("Error") end
Lua 中不支持switch語句,可使用這種嵌套的if進行分支判斷。spa
whilecode
與其餘語言中的while循環同樣,Lua先測試while的條件。若是條件爲假,那麼循環結束;否則,Lua執行循環體,並重復這一過程。索引
local i = 1 while a[i] do print(a[i]) end
repeatip
一條repeat-until語句重複執行其循環體直到條件爲真時結束。測試是在循環體以後作的,所以循環體至少執行一次。作用域
repeat line = io.read() until line ~= "" print(line)
與其餘大多數語言不一樣的是,在Lua中,一個聲明在循環體中的局部變量的做用域包括了條件測試。字符串
local sqr = x/2 repeat sqr = (sqr + x/sqr)/2 local error = math.abs(sqr^2 - x) until error < x/10000 --在此仍能夠訪問error
數字型for循環
數字型for循環語法:
for var = exp1 , exp2, exp3 do <執行體> end
【14-09-25更新:數字型for循環語句的結構是指:變量var從exp1 變換到 exp2,每次變化都以exp3做爲步長遞增(減) var,並執行一次「執行體」】
第三個表達式是可選的,若不指定的話,Lua會將步長默認爲1。若是不想給循環設置上限的話,可使用常量math.huge。
for i = 1, math.huge do <執行體> end
for循環的3個表達式是在循環開始前一次性求值的。其次,控制變量會被自動地聲明爲for語句的局部變量,而且僅在循環體內可見(所以,控制變量在循環結束後就不存在了)。
若是須要在循環結束後訪問控制變量的值(一般是在break循環時),必須將該值保存到另外一個變量中:
local found = nil for i = 1, #a do if a[i] < 0 then found = i break end end print(found)
不要在循環過程當中修改控制變量的值,不然會致使不可預知的的效果。可使用break語句終止for 循環。
泛型for
泛型for循環經過一個迭代器函數來遍歷全部值:
---打印數組a的全部值 for i, v in ipairs(a) do print(v) end
Lua的基礎庫提供了ipairs,這是一個用於遍歷數組的迭代器函數。每次循環中,i會被賦予一個索引值,同時v被賦予一個對應於該索引值的元素值。
標準庫提供了幾種迭代器:迭代文件中每行:io.lines、迭代table元素的(pairs)、迭代數組元素的(ipairs)、迭代字符串中單詞的(string.gmtch)。對於泛型for循環一樣注意兩點:
1,循環的變量是循環體的局部變量。
2,毫不應該對循環變量做任何賦值。
break與return
break和return用於跳出當前的塊。
break語句用於結束一個循環,它只會跳出包含它的那個內部循環(for、repeat或while),而不會改變外層的循環。
return語句用於從一個函數返回結果,或者用於簡單地結束一個函數的執行。任何函數的結尾處都有一句隱式的return。
break和return只能是一個塊的最後一條語句。換句話說,他們應是程序塊的最後一條語句,或者是end、else或until前的一條語句。