說句實話,每當看到Lua代碼,我都感覺是半個SQL代碼,寫起來還是感覺有點恐怖。
while循環:
與C#的while循環類似,沒有什么好說的;
--------Lua的while循環 while(condition)dostatementsend
?
For循環
exp1為起點,exp2為終點,exp3為步進值,若exp3沒有寫,則默認為1
Lua的For循環 for var=exp1,exp2,exp3 do <執行體> end
?
Repeat循環:
看起來很高大上的說法, 實則就是我們平時使用的do..while循環而已
a = 10 --[ 執行循環 --] repeatprint("a的值為:", a)a = a + 1 until( a > 15 )
?
迭代器循環:
C#里面的迭代器循環使用的最多的當然是foreach循環了,當然協程也是個迭代器循環,我們這里只是舉例,所以我們這里就不要講太多了
array = {"Lua", "Tutorial"} --一個Table,也能想象成一個字典
lua的迭代器分為無狀態迭代器和多狀態迭代器
無狀態迭代器:
function square(iteratorMaxCount,currentNumber)if currentNumber<iteratorMaxCountthencurrentNumber = currentNumber+1return currentNumber, currentNumber*currentNumberend endfor i,n in square,3,0 --square是一個可以參與運行的函數,3和0為參數 doprint(i,n) end
多狀態迭代器:
多狀態迭代器可以遍歷一個函數的結果集和pairs和ipairs兩種特殊迭代方式
迭代函數的結果集:
array = {"Lua", "Tutorial"}function elementIterator (collection)local index = 0local count = #collection --井號能取出collection參數的數量,若為[1] = ,[2] = ,則取出從第一個元素連續最多元素的數量,假如沒有3,直接跳到了[4] = ,則#collection的值為2-- 閉包函數return function ()index = index + 1if index <= countthen-- 返回迭代器的當前元素return collection[index]endend endfor element in elementIterator(array) doprint(element) end
?
pairs: 迭代 table,可以遍歷表中所有的 key 可以返回 nil
ipairs: 迭代數組,不能返回 nil,如果遇到 nil 則退出
local tab= { [1] = "a", [3] = "b", [4] = "c" } for i,v in pairs(tab) do -- 輸出 "a" ,"b", "c" ,print( tab[i] ) end for i,v in ipairs(tab) do -- 輸出 "a" ,k=2時斷開 print( tab[i] ) end
ipairs的迭代,會像C#的foreach那樣,挨個寫入堆棧。
但重要點說明一下paris跌代,或取的數據順序并不是一個讓人很好理解的順序,因為它并不會按照1234這種順序排下來,paris迭代產生的結果列表的排列,是按照一定的希哈規律來排列的,所以并不是無規則的無序,而是按哈規則的有序。
如果數據量非常龐大的話,paris的希哈排列,會造成性能上非常大的優勢,倘若將列表值賦值給C#,然后以linq、lambda的方式來取,則也并不需要有序。
所以不要糾結于paris中看似無序實則有序的排列。