iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
Software Development

30天 Lua重拾筆記系列 第 13

【30天Lua重拾筆記13】基礎2: 控制-for迴圈

本文同步發表於個人網站

相較於if,Lua的for迴圈有兩種,或說是三種。

進步的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

pairs & ipairs初探 - for-in迴圈

for-in迴圈用於迭代陣列(array)或表格(table)時。

Lua是沒有array型態的(還記得8種基礎型別嗎),關於這點之後會在說明。
至於什麼是table?可以想像成是ES6裡的object,或者更接近於Map

可以分別用ipairspairs來處理:

迭代陣列

array = {"one", "two", "three"}

for i, v in ipairs(array) do
  print(i, v)
end

1 one
2 two
3 three

留意一下,從1開始。
※ 注意! ipairspairs,以及陣列長度#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: 也可以用上面同樣方式忽略vk


上一篇
【30天Lua重拾筆記12】基礎2: 控制 - 條件
下一篇
【30天Lua重拾筆記14】基礎2: 控制-while、repeat迴圈
系列文
30天 Lua重拾筆記36

尚未有邦友留言

立即登入留言