了解 Lua 的 for 循環
了解 for 循環結構和你在控制它時擁有的選項,這樣你可以對如何在 Lua 中處理數據做出聰明的決定。
在編程中,迭代是一個重要的概念,因為代碼通常必須多次掃描一組數據,以便它可以單獨處理每個項目。控制結構使你能夠根據通常在程序運行時動態建立的條件來指導程序的流程。不同的語言提供不同的控制,在 Lua 中,有 while
循環、for
循環和 repeat until
循環。本文介紹 for
循環。我將在另一篇文章中介紹 while
和 repeat until
循環。
for 循環
for
循環接受已知數量的項目並確保處理每個項目。「項目」可以是數字,它也可以是一個包含多個條目或任何 Lua 數據類型的表。語法和邏輯有點靈活,但語法允許這些參數,每個參數本質上描述了一個計數器:
- 計數器的起始值
- 停止值
- 你希望計數器前進的增量
例如,假設你有三個項目並希望 Lua 處理每個項目。你的計數器可以從 3 開始一直持續到 1,增量為 -1。這呈現為 3、2、1 的計數。
mytable = { "zombie", "Halloween", "apocalypse" }
for count = 3, 1, -1 do
print(count .. ": " .. mytable[count])
end
運行代碼以確保所有三個項目都得到處理:
$ lua ./for.lua
3: apocalypse
2: Halloween
1: zombie
這段代碼有效地「反向」處理了表,因為它是倒數。你可以正數:
for count = 1, 3, 1 do
print(mytable[count])
end
此示例從最低索引到最高索引處理表:
$ lua ./for.lua
1: zombie
2: Halloween
3: apocalypse
增量
你也可以更改增量。例如,也許你想要一個沒有萬聖節盛況的殭屍啟示錄:
mytable = { "zombie", "Halloween", "apocalypse" }
for count = 1, 3, 2 do
print(mytable[count])
end
運行代碼:
$ lua ./for.lua
zombie
apocalypse
該示例列印了 1 和 3,因為第一個計數是 1,然後遞增 2(總共 3)。
計數器
有時你不知道需要 Lua 遍曆數據的次數。在這種情況下,你可以將計數器設置為由其他進程填充的變數。
另外,count
這個詞不是關鍵字。為了清楚起見,這正是我在示例代碼中使用的內容。程序員通常使用更短的名稱,例如 i
或 c
。
var = os.time()
if var%2 == 0 then
mytable = { var }
else
mytable = { "foo", "bar", "baz" }
end
for c = 1, #mytable, 1 do
print(mytable[c])
end
此代碼創建一個變數,其中包含啟動時的時間戳。如果時間戳是偶數(除以 2 時模數為 0),則只將時間戳放入表中。如果時間戳是奇數,它將三個字元串放入一個表中。
現在你無法確定你的 for
循環需要運行多少次。可能是一次或是三次,但沒有辦法確定。解決方案是將起始計數設置為 1,將最終計數設置為表的長度(#mytable
是確定表長度的內置快捷方式)。
可能需要多次運行腳本才能看到這兩個結果,但最終,你會得到如下結果:
$ lua ./dynamic.lua1665447960
$ lua ./dynamic.lua
foo
bar
baz
帶 pairs 和 ipairs 的 for 循環
如果你已經閱讀了我關於 表迭代 的文章,那麼你已經熟悉了 Lua 中最常見的 for
循環之一。這個使用 pairs
或 ipairs
函數來迭代一個表:
mytable = { "zombie", "Halloween", "apocalypse" }
for i,v in ipairs(mytable) do
print(i .. ": " v)
end
pairs
和 ipairs
函數「解包」表並將值轉儲到你提供的變數中。在此示例中,我將 i
用於 索引,將 v
用於 值,但變數名稱無關緊要。
$ lua ./for.lua1: zombie2: Halloween3: apocalypse
for 循環
for
循環結構在編程中很常見,由於經常使用表和 pairs
函數,因此在 Lua 中非常常見。了解 for
循環結構和控制它時的選項意味著你可以就如何在 Lua 中處理數據做出明智的決定。
via: https://opensource.com/article/22/11/lua-for-loops
作者:Seth Kenlon 選題:lkxed 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive