Lua - 迭代器:初學者指南

你好,未來的 Lua 程式設計者!今天,我們將踏上一段令人興奮的旅程,探索 Lua 迭代器的世界。別擔心如果你是編程新手——我將成為你的友好導覽,我們會一步步來。在本教程結束時,你將會像專業人士一樣進行迭代!

Lua - Iterators

迭代器是什麼?

在我們深入之前,讓我們先了解迭代器是什麼。想像你有一籃子蘋果,你想一一檢查每個蘋果。迭代器就像一隻神奇的手,幫助你依次拿起每個蘋果,而不需要你擔心籃子裡有多少蘋果或者它們是如何排列的。

在編程術語中,迭代器是允許我們遍歷集合(如 Lua 中的數組或表)中所有元素的對象,而不需要知道該集合的底層結構。

現在,讓我們探討 Lua 中的不同類型迭代器!

泛型 For 迭代器

泛型 for 循環是使用迭代器在 Lua 中最常見的方式。它簡單、優雅且強大。讓我們從一個基本示例開始:

local fruits = {"apple", "banana", "orange", "grape"}

for i, fruit in ipairs(fruits) do
print(i .. ": " .. fruit)
end

如果你運行這段代碼,你將看到:

1: apple
2: banana
3: orange
4: grape

讓我們分解這段代碼:

  • 我們創建了一個水果表(數組)。
  • 我們使用 for 循環和 ipairs,這是一個內置的迭代器函數。
  • i 是索引,fruit 是該索引位置的值。
  • 循環會在達到表的結尾時自動停止。

這不是很棒嗎?就像我們的神奇手在拿起每個水果並告訴我們它在籃子中的位置!

另一個示例:遍歷字典

讓我們試試不同的東西:

local person = {name = "Alice", age = 30, job = "Developer"}

for key, value in pairs(person) do
print(key .. " = " .. value)
end

這將輸出:

name = Alice
age = 30
job = Developer

在這裡,我們使用 pairs 而不是 ipairspairs 非常適合用於不是簡單列表的表,如我們的 person 表。

無狀態迭代器

現在,讓我們升級一點。無狀態迭代器是在調用之間不保留任何狀態的函數。它們簡單且高效。這裡有一個示例:

function square(max, current)
current = current or 0
if current >= max then
return nil
end
return current + 1, (current + 1)^2
end

for i, squared in square, 5 do
print(i .. " 平方是 " .. squared)
end

這將輸出:

1 平方是 1
2 平方是 4
3 平方是 9
4 平方是 16
5 平方是 25

讓我們分解這段代碼:

  • 我們定義了一個 square 函數,它接受一個 max 值和一個 current 值。
  • 函數返回下一個數字及其平方,或者當我們完成時返回 nil
  • for 循環中,我們直接將此函數用作迭代器。

這就像擁有一個計算器,每次我們按按鈕時,它都給我們下一個平方數!

有狀態迭代器

最後,讓我們來討論有狀態迭代器。這些更複雜但也更強大。它們在調用之間記住它們的狀態。這裡有一個示例:

function fibonacci(n)
local count = 0
local a, b = 0, 1
return function()
if count < n then
count = count + 1
a, b = b, a + b
return count, a
end
end
end

for i, fib in fibonacci(10) do
print("第 " .. i .. " 個斐波那契數字是 " .. fib)
end

這將輸出前 10 個斐波那契數字:

第 1 個斐波那契數字是 1
第 2 個斐波那契數字是 1
第 3 個斐波那契數字是 2
第 4 個斐波那契數字是 3
第 5 個斐波那契數字是 5
第 6 個斐波那契數字是 8
第 7 個斐波那契數字是 13
第 8 個斐波那契數字是 21
第 9 個斐波那契數字是 34
第 10 個斐波那契數字是 55

這個迭代器就像一個小型斐波那契數字工廠。每次我們調用它時,它都會記住它停在哪裡並給我們序列中的下一個數字。

結論

這就是全部!我們探索了 Lua 迭代器的世界,從簡單的泛型 for 循環到更複雜的有狀態迭代器。記住,熟能生巧。嘗試為不同的序列或數據結構創建自己的迭代器。

這裡是我們使用過的迭代器函數的快速參考表:

函數 描述 使用案例
ipairs() 遍歷類似數組的表 用於編號列表
pairs() 遍歷表中所有元素 用於字典或混合表
自定義函數 可以是無狀態或有狀態 用於特殊序列或複雜迭代

快樂編程,願你的迭代總是充滿成果!

Credits: Image by storyset