web-dev-qa-db-ja.com

LuaのForループ

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

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

他のことを試してみましたが、うまくいきません。端末には常に1、2、3と表示されます。

73
SamYoungNY

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

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

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

Forループは、ループの内部がnames = 1、次にnames = 2、最後にnames = 3で呼び出されることを示しています。 forループは、最初の数から最後の数までカウントするcounterを宣言し、カウントする値ごとに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

存在しないテーブルの値にアクセスしようとするとnilになるため、John Joe 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値は、そのインデックスの値です。だから、基本的にはあなたのために多くの無骨な仕事をします。

179
Nicol Bolas

オンラインで読むと( tables tutorial )テーブルは配列のように振る舞うように見えるので、探しているものは:

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

したがって、iを1から3に変更するだけです。

OnWay2代わりに、実行するテーブルを指定し、キーと値に変数を割り当てます。例:

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

次を印刷します。

1   John
2   Joe
myKey   myValue
17
derp
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
0
Elliot