Lua - イテレータ:入門ガイド

こんにちは、将来のLuaプログラマーさん!今日は、Luaのイテレータの世界に楽しく飛び込みます。プログラミングが新しい方でも心配しないでください。私はあなたの親切なガイドとして、ステップバイステップで進めます。このチュートリアルの終わりまでに、プロのようにイテレートするスキルを身につけてください!

Lua - Iterators

イテレータとは?

まず、イテレータとは何かを理解しましょう。例えば、バスケットにりんごが入っているとします。そして、それぞれのりんごを一つずつ見たいと思っています。イテレータは、バスケットのりんごを順番に拾ってくれる魔法の手のようなものです。バスケットの中にどれだけのりんごが入っているかや、どのように並んでいるかを気にする必要はありません。

プログラミング用語では、イテレータはコレクション(Luaの配列やテーブルなど)のすべての要素を巡回するためのオブジェクトで、そのコレクションの下層構造を知る必要がありません。

では、Luaのさまざまな種類のイテレータを見てみましょう!

ゼネリックフォーイテレータ

ゼネリックフォーループは、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

ここでは、ipairsの代わりにpairsを使用しています。pairsは、シンプルなリスト以外のテーブル(例えば、私たちの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 is " .. squared)
end

これが以下のように出力されます:

1 squared is 1
2 squared is 4
3 squared is 9
4 squared is 16
5 squared is 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("The " .. i .. "th Fibonacci number is " .. fib)
end

これは最初の10個のフィボナッチ数を以下のように出力します:

The 1th Fibonacci number is 1
The 2th Fibonacci number is 1
The 3th Fibonacci number is 2
The 4th Fibonacci number is 3
The 5th Fibonacci number is 5
The 6th Fibonacci number is 8
The 7th Fibonacci number is 13
The 8th Fibonacci number is 21
The 9th Fibonacci number is 34
The 10th Fibonacci number is 55

このイテレータはまるで小さなフィボナッチ数の工場のようです。 mỗi回呼び出すたびに、どこで止まっていたかを覚えて次の数を返します。

結論

そして、ここまでです!Luaのイテレータの世界を探求しました。シンプルなゼネリックフォーループから複雑なステートフルイテレータまで。練習することが完璧を達成する鍵です。さまざまなシーケンスやデータ構造のための自分独自のイテレータを作成してみてください。

以下は、私たちが使用したイテレータ関数の簡単な参照表です:

関数 説明 使用例
ipairs() 配列のようなテーブルをイテレート 番号付きリスト
pairs() すべてのテーブル要素をイテレート 辞書または混合テーブル
カスタム関数 ステートレスまたはステートフル 特殊なシーケンスまたは複雑なイテレーション

ハッピーコーディング、そしてあなたのイテレーションが常に豊かでありますように!

Credits: Image by storyset