本文同步發表於個人網站
相較於if
,Lua的for
迴圈有兩種,或說是三種。
印出1-10:
for i = 1, 10, 1 do
print(i)
end
很類似C語言
#include <stdio.h>
int main(void){
int i = 0;
for(i = 1; i <= 10; i++){
printf("%d\n", i);
}
}
不同的是以逗點代替分號,中止條件相同時仍會在執行一次,進步(step)使用表達是,會自動相加並重新賦予值。
了解後也可來寫成10到1的程式:
for i = 10, 1, -1 do
print(i)
end
for-do
也是一個區塊,於一開始宣告的變數僅do-end
內部可見。這表示下方寫法中,進步條件指的是外部的i
,其值為1
。結果與輸出1-10相同。
i = 1
for i = 1, 10, i do
print(i)
end
for-in
迴圈用於迭代陣列(array
)或表格(table
)時。
Lua是沒有array型態的(還記得8種基礎型別嗎),關於這點之後會在說明。
至於什麼是table
?可以想像成是ES6裡的object
,或者更接近於Map
可以分別用ipairs
和pairs
來處理:
array = {"one", "two", "three"}
for i, v in ipairs(array) do
print(i, v)
end
1 one
2 two
3 three
留意一下,從1
開始。
※ 注意! ipairs
和pairs
,以及陣列長度#array
等還有一些未提到的事情在。
很像是Python使用enumerate
arr = ["one", "two", "three"]
for i, v in enumerate(arr):
print(i,v)
實際上可以忽略v
array = {"one", "two", "three"}
for i in ipairs(array) do
print(i, array[i])
end
或是改寫成:
array = {"one", "two", "three"}
for _,v in ipairs(array) do
print(_,v)
end
單底線
_
也是合法的變數名稱。
不過按於習慣,表示不會去使用他。(上例拿來使用了不太好)
(Golang有明確的規範)
tb = {
["key1"] = "one",
["key2"] = "two",
["key3"] = "three",
}
for k, v in pairs(tb) do
print(k, v)
end
key3 three
key1 one
key2 two
※ Note: 也可以用上面同樣方式忽略v
或k
。