LuaのForループ


86

私の課題は、forループを実行する方法です。私はそれを数字で理解しましたが、名前で理解することはできません。名前のリストを実行するforループを作成したいと思います。以下は私がこれまでに持っているものです:

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

他のことを試しましたが、うまくいきません。端末には常に1、2、3が表示されます...何が間違っているのでしょうか。

回答:


203

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

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

このコードは、最初にと呼ばれるグローバル変数を宣言しますnames。次に、forループを開始します。forループは、たまたま呼び出されたローカル変数を宣言しnamesます。変数が以前にで定義されていたという事実は、namesまったく関係ありません。namesforループ内での使用は、グローバルではなくローカルのものを参照します。

forループループの内側の一部を使って呼び出されることを言いますnames = 1、その後、names = 2、そして最後にnames = 3。forループは、最初の数値から最後の数値までカウントするカウンターを宣言し、カウントする値ごとに1回内部コードを呼び出します。

あなたが実際に欲しかったのは次のようなものでした:

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

[]構文は、Luaテーブルのメンバーにアクセスする方法です。Luaテーブルは「キー」を「値」にマップします。配列は整数型のキーを自動的に作成し、増加します。したがって、テーブルの「Joe」に関連付けられているキーは2です(Luaインデックスは常に1から始まります)。

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

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

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値は、そのインデックスの値です。だからそれは基本的にあなたのためにたくさんのうなり声の仕事をします。


1
したがって、for with ipairs()は、他の言語ではforeach()として機能します
boctulus 2016年

15
すばらしい答えです。最後の例では_、変数が使用されていないときに使用するのがかなり一般的であることを付け加えておきます。例names = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
フレイザー

19

オンライン(テーブルチュートリアル)を読むと、テーブルは配列のように動作するように見えるので、次のものを探しています。

Way1

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

Way2

names = {'John', 'Joe', 'Steve'}
for k,v in pairs(names) do print(v) end

Way1はテーブルを使用します。テーブルindex/keyでは、names各要素に1から始まるキーがあります。例:

names = {'John', 'Joe', 'Steve'}
print( names[1] ) -- prints John

だからあなたはただi1から3に行くだけです。

ウェイ2の代わりにあなたが実行され、例えばそのキーと値の変数を割り当てたいものをテーブルを指定します:

names = {'John', 'Joe', myKey="myValue" }
for k,v in pairs(names) do print(k,v) end

以下を出力します。

1   John
2   Joe
myKey   myValue

6
テーブルのチュートリアルを読みましたが、表示されませんでしたipairsか?または、pairs特定の順序でキー値を返す必要がない部分ですか?
ニコルボーラス2011年

ipairs最初は実際に使用しましたが、数値以外のキーmyKey="myValue"が必要な例を追加したときにpairs、残りのキーも変更することにしpairsました。ペアでの注文が保証されないことを省略して申し訳ありませんが、彼が読めるようにリンクをそこに残しました。
derp 2011年

1
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. テーブルを削除し、intに置き換えます
  2. テーブルから値を取得していません

試してみてください:

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

1
反対票:反対票を投じる正当な理由を記入してください。スコープでnames宣言されている(整数カウンター)forがローカル変数を導入namesし、グローバルスコープで宣言されている(テーブル配列)をシャドウするという点で、答えは誤解を招くと思いますが。
dejavu 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.