日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openresty开发系列16--lua中的控制结构if-else/repeat/for/while

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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-elseif 條件 then--條件為真 執行此body else--條件為假 執行此body end ---------- x = 10 if x > 0 thenprint("分支一") elseprint("分支二") end 運行輸出:分支一3)多個分支 if-elseif-elseif 條件一 then--條件為真 執行此body elseif 條件二 then..... elseif 條件三 then..... else--條件為假 執行此body endscore = 90 if score == 100 thenprint("分支一") elseif score >= 60 thenprint("分支二") --此處可以添加多個elseif elseprint("分支三") end 運行輸出:分支二與 C 語言的不同之處是 elseif 是連在一起的,若將 elseif 寫成 "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 和范型 for1)數字型 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 end2for 泛型 對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(12、...),變量 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。