openresty开发系列16--lua中的控制结构if-else/repeat/for/while
生活随笔
收集整理的這篇文章主要介紹了
openresty开发系列16--lua中的控制结构if-else/repeat/for/while
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
openresty開發系列16--lua中的控制結構if-else/repeat/for/while一)條件 - 控制結構 if-else
if-else 是我們熟知的一種控制結構。Lua 跟其他語言一樣,提供了 if-else 的控制結構。1)單個 if 分支 型if 條件 then--body
end
條件為真 ,執行if中的body
-----------------------
x = 10
if x > 0 thenprint("分支一")
end
----
x = 10
if (x > 0) thenprint("分支一")
end運行輸出:分支一2)兩個分支 if-else 型if 條件 then--條件為真 執行此body
else--條件為假 執行此body
end
----------
x = 10
if x > 0 thenprint("分支一")
elseprint("分支二")
end
運行輸出:分支一3)多個分支 if-elseif-else 型if 條件一 then--條件為真 執行此body
elseif 條件二 then.....
elseif 條件三 then.....
else--條件為假 執行此body
endscore = 90
if score == 100 thenprint("分支一")
elseif score >= 60 thenprint("分支二")
--此處可以添加多個elseif
elseprint("分支三")
end
運行輸出:分支二與 C 語言的不同之處是 else 與 if 是連在一起的,若將 else 與 if 寫成 "else if" 則相當于在 else 里嵌套另一個 if 語句,如下代碼:
score = 0
if score == 100 thenprint("分支一")
elseif score >= 60 thenprint("分支二")
elseif score > 0 thenprint("分支三")elseprint("分支四")end --與上一示例代碼不同的是,此處要添加一個end
end
運行輸出:分支四二)循環 - while 型控制結構
Lua 跟其他常見語言一樣,提供了 while 控制結構,語法上也沒有什么特別的。但是沒有提供 do-while 型的控制結構,但是提供了功能相當的 repeat。
while 型控制結構語法如下,當表達式值為假(即 false 或 nil)時結束循環。也可以使用 break 語言提前跳出循環。while 條件表達式 do
--body
end示例代碼,求 1 + 2 + 3 + 4 + 5 的結果x = 1
sum = 0while x <= 5 dosum = sum + xx = x + 1
end
print(sum) -->output 15continue繼續執行,lua是沒有這個概念break 終端循環,lua是有的值得一提的是,Lua 并沒有像許多其他語言那樣提供類似 continue 這樣的控制語句用來立即進入下一個循環迭代(如果有的話)。因此,我們需要仔細地安排循環體里的分支,以避免這樣的需求。
沒有提供 continue,卻也提供了另外一個標準控制語句 break,可以跳出當前循環。例如我們遍歷 table,查找值為 11 的數組下標索引:local t = {1, 3, 5, 8, 11, 18, 21}local i = 1while i < #t doif 11 == t[i] thenprint("index[" .. i .. "] have right value[11]")breakendi = i + 1;
end三)循環 - repeat 控制結構repeat ---重復執行--body
until 條件 條件為真時就結束1)until的條件表達式 為真 就結束2)repeat until 控制結構 ,他至少會執行一遍Lua 中的 repeat 控制結構類似于其他語言(如:C++ 語言)中的 do-while,但是控制方式是剛好相反的。簡單點說,執行 repeat 循環體后,直到 until 的條件為真時才結束,而其他語言(如:C++ 語言)的 do-while 則是當條件為假時就結束循環。
以下代碼將會形成死循環:
x = 10
repeatprint(x)
until false
該代碼將導致死循環,因為until的條件一直為假,循環不會結束
除此之外,repeat 與其他語言的 do-while 基本是一樣的。同樣,Lua 中的 repeat 也可以在使用 break 退出。四)for 控制結構for 語句有兩種形式:數字 for 和范型 for。1)數字型 for 的語法如下:
for var = begin, finish, step do--body
end
關于數字 for 需要關注以下幾點:
1.var 從 begin 變化到 finish,每次變化都以 step 作為步長遞增 var
2.begin、finish、step 三個表達式只會在循環開始時執行一次
3.第三個表達式 step 是可選的,默認為 1
4.控制變量 var 的作用域僅在 for 循環內,需要在外面控制,則需將值賦給一個新的變量 5.循環過程中不要改變控制變量的值,那樣會帶來不可預知的影響for i = 1, 5 doprint(i)
end-- output:
1
2
3
4
5for i = 1, 10, 2 doprint(i)
end-- output:
1
3
5
7
9for i = 10, 1, -1 doprint(i)
end-- output:
10
9
8
7
6
5
4
3
2
1如果不想給循環設置上限的話,可以使用常量 math.huge:
for i = 1, math.huge doif (0.3*i^3 - 20*i^2 - 500 >=0) thenprint(i)breakend
end2)for 泛型
對lua的table類型進行遍歷泛型 for 循環通過一個迭代器(iterator)函數來遍歷所有值:
-- 打印數組a的所有值
local a = {"a", "b", "c", "d"}
for i, v in ipairs(a) doprint("index:", i, " value:", v)
end-- output:
index: 1 value: a
index: 2 value: b
index: 3 value: c
index: 4 value: d
Lua 的基礎庫提供了 ipairs,這是一個用于遍歷數組的迭代器函數。在每次循環中,i 會被賦予一個索引值,同時 v 被賦予一個對應于該索引的數組元素值。下面是另一個類似的示例,演示了如何遍歷一個 table 中所有的 key
-- 打印table t中所有的key
for k in pairs(t) doprint(k)
endpairs是可以把數組類型和哈希類型索引值,都會迭代出來對于泛型 for 的使用,再來看一個更具體的示例。假設有這樣一個 table,它的內容是一周中每天的名稱:
local days = {"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"
}k v ===》 v ,k現在要將一個名稱轉換成它在一周中的位置。為此,需要根據給定的名稱來搜索這個 table。然而 在 Lua 中,通常更有效的方法是創建一個"逆向 table"。例如這個逆向 table 叫 revDays,它以 一周中每天的名稱作為索引,位置數字作為值:local revDays = {["Sunday"] = 1,["Monday"] = 2,["Tuesday"] = 3,["Wednesday"] = 4,["Thursday"] = 5,["Friday"] = 6,["Saturday"] = 7}接下來,要找出一個名稱所對應的需要,只需用名字來索引這個 reverse table 即可:
local x = "Tuesday"
print(revDays[x]) -->3當然,不必手動聲明這個逆向 table,而是通過原來的 table 自動地構造出這個逆向 table:local days = {"Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday","Sunday"
}local revDays = {}
for k, v in pairs(days) dorevDays[v] = k
end-- print value
for k,v in pairs(revDays) doprint("k:", k, " v:", v)
end-- output:
k: Tuesday v: 2
k: Monday v: 1
k: Sunday v: 7
k: Thursday v: 4
k: Friday v: 5
k: Wednesday v: 3
k: Saturday v: 6
這個循環會為每個元素進行賦值,其中變量 k 為 key(1、2、...),變量 v 為 value("Sunday"、"Monday"、...)。
值得一提的是,在 LuaJIT 2.1 中,ipairs() 內建函數是可以被 JIT 編譯的,而 pairs() 則只能被解釋執行。因此在性能敏感的場景,應當合理安排數據結構,避免對哈希表進行遍歷。事實上,即使未來 pairs 可以被 JIT 編譯,哈希表的遍歷本身也不會有數組遍歷那么高效,畢竟哈希表就不是為遍歷而設計的數據結構。五)break,return 關鍵字1)break
語句 break 用來終止 while、repeat 和 for 三種循環的執行,并跳出當前循環體, 繼續執行當前循環之后的語句。下面舉一個 while 循環中的 break 的例子來說明:
-- 計算最小的x,使從1到x的所有數相加和大于100
sum = 0
i = 1
while true dosum = sum + iif sum > 100 thenbreakendi = i + 1
end
print("The result is " .. i) -->output:The result is 14
在實際應用中,break 經常用于嵌套循環中。2)returnreturn 主要用于從函數中返回結果,或者用于簡單的結束一個函數的執行。 return 只能寫在語句塊的最后,一旦執行了 return語句,該語句之后的所有語句都不會再執行。執行return方法,如果實在主函數體里面,不在語句塊中;執行return 且沒有返回值,之后的語句照樣會執行若要寫在函數中間,則只能寫在一個顯式的語句塊內,參見示例代碼:local function add(x, y)return x + y
endlocal function is_positive(x)if x > 0 thenreturn x .. " is > 0"elsereturn x .. " is not > 0"endprint("function end!")
end--由于return只出現在前面顯式的語句塊,所以此語句不注釋也不會報錯
--,但是不會被執行,此處不會產生輸出sum = add(10, 20)
print("The sum is " .. sum) -->output:The sum is 30
answer = is_positive(-10)
print(answer) -->output:-10 is is not > 0有時候,為了調試方便,我們可以想在某個函數的中間提前 return,以進行控制流的短路。此時我們可以將 return 放在一個 do ... end 代碼塊中,例如:local function add(x, y)print(1)returnprint(2)
end
--return 不放在語句塊中,return 也沒有返回值,不注釋該語句,不會報錯; 但會執行return之后的業務local function add(x, y)print(1)do return endprint(2)
end
?
轉載于:https://www.cnblogs.com/reblue520/p/11429776.html
總結
以上是生活随笔為你收集整理的openresty开发系列16--lua中的控制结构if-else/repeat/for/while的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openresty开发系列15--lua
- 下一篇: openresty开发系列17--lua