Linux中國

了解 Lua 的 for 循環

了解 for 循環結構和你在控制它時擁有的選項,這樣你可以對如何在 Lua 中處理數據做出聰明的決定。

在編程中,迭代是一個重要的概念,因為代碼通常必須多次掃描一組數據,以便它可以單獨處理每個項目。控制結構使你能夠根據通常在程序運行時動態建立的條件來指導程序的流程。不同的語言提供不同的控制,在 Lua 中,有 while 循環、for 循環和 repeat until 循環。本文介紹 for 循環。我將在另一篇文章中介紹 whilerepeat 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 這個詞不是關鍵字。為了清楚起見,這正是我在示例代碼中使用的內容。程序員通常使用更短的名稱,例如 ic

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 循環之一。這個使用 pairsipairs 函數來迭代一個表:

mytable = { "zombie", "Halloween", "apocalypse" }
for i,v in ipairs(mytable) do
  print(i .. ": " v)
end

pairsipairs 函數「解包」表並將值轉儲到你提供的變數中。在此示例中,我將 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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國