私の課題は、forループを実行する方法です。私はそれを数字で理解しましたが、名前で理解することはできません。名前のリストを実行するforループを作成したいと思います。以下は私がこれまでに持っているものです:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
他のことを試しましたが、うまくいきません。端末には常に1、2、3が表示されます...何が間違っているのでしょうか。
私の課題は、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ループは、最初の数値から最後の数値までカウントするカウンターを宣言し、カウントする値ごとに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
値は、そのインデックスの値です。だからそれは基本的にあなたのためにたくさんのうなり声の仕事をします。
_
、変数が使用されていないときに使用するのがかなり一般的であることを付け加えておきます。例names = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
オンライン(テーブルチュートリアル)を読むと、テーブルは配列のように動作するように見えるので、次のものを探しています。
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に行くだけです。
上ウェイ2の代わりにあなたが実行され、例えばそのキーと値の変数を割り当てたいものをテーブルを指定します:
names = {'John', 'Joe', myKey="myValue" }
for k,v in pairs(names) do print(k,v) end
以下を出力します。
1 John
2 Joe
myKey myValue
ipairs
か?または、pairs
特定の順序でキー値を返す必要がない部分ですか?
ipairs
最初は実際に使用しましたが、数値以外のキーmyKey="myValue"
が必要な例を追加したときにpairs
、残りのキーも変更することにしpairs
ました。ペアでの注文が保証されないことを省略して申し訳ありませんが、彼が読めるようにリンクをそこに残しました。
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
試してみてください:
names = {'John','Joe','Steve'}
for i = 1,3 do
print(names[i])
end
names
宣言されている(整数カウンター)for
がローカル変数を導入names
し、グローバルスコープで宣言されている(テーブル配列)をシャドウするという点で、答えは誤解を招くと思いますが。