1. ホーム
  2. loops

[解決済み] LuaのFor Loop

2023-03-27 19:12:40

質問

私の課題はforループをどうやるかです。数値の面ではわかったのですが、名前の面ではわかりません。私は名前のリストを実行するforループを作成したいと思います。以下は、私がこれまでに持っているものです。

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

私はいくつかの他のものを試してみましたが、それはちょうど動作しません、ターミナルは常に1、2、3をリストするだけです... 私は何を間違えているのでしょうか?

どのように解決するのですか?

あなたの問題は単純です。

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

このコードでは、まずグローバル変数 names . そして、forループを開始します。このforループでは ローカル という変数を宣言しています。 names という変数が定義されていることです。 names で定義されていたという事実は全く関係ありません。どのような names を使用した場合、for ループの内部では ローカル を参照します。

forループでは、ループの内側が names = 1 で、次に names = 2 であり、最後に names = 3 . for ループでは カウンタ を宣言し、最初の数から最後の数までカウントし、カウントした値ごとに内部のコードを呼び出します。

あなたが実際に望んでいたのは、このようなものでした。

names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
  print (names[nameCount])
end

Luaのテーブルのメンバーには、[]構文でアクセスします。Luaのテーブルは、quot;キーとquot;値をマッピングします。配列は、自動的に整数型のキーを作成し、増加します。つまり、テーブル内の"Joe"に関連するキーは2です(Luaのインデックスは常に1から始まっています)。

したがって、1から3までカウントするforループが必要であり、これを取得します。テーブルから要素にアクセスするために、count変数を使用します。

しかし、これには欠点があります。もし、リストから要素の一つを削除したらどうなるでしょうか?

names = {'John', 'Joe'}
for nameCount = 1, 3 do
  print (names[nameCount])
end

では、次のようになります。 John Joe nil となります。なぜなら、存在しないテーブルの値にアクセスしようとすると nil . これを防ぐには、1 から数えて の長さ まで数える必要があります。

names = {'John', 'Joe'}
for nameCount = 1, #names do
  print (names[nameCount])
end

# は長さ演算子です。これはテーブルと文字列に対して働き、どちらかの長さを返します。さて、どんなに大きくても小さくても names がどんなに大きくなっても、これは常に動作します。

しかし、アイテムの配列を繰り返し処理する、より便利な方法があります。

names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
  print (name)
end

ipairs はリストを反復処理するLuaの標準関数です。このスタイルの for ループ、イテレータフォーループは、この種のイテレータ関数を使用します。そのため i の値は配列中のエントリーのインデックスです。また name の値はそのインデックスの値です。つまり、基本的に多くの作業を代行してくれるわけです。