web-dev-qa-db-ja.com

キーと値のペアを含むluaテーブルの「for each」ループ

次のように定義されたテーブルがあるとします:

myTable = { myValue = nil, myOtherValue = nil}

このようなfor eachファッションループでどのように繰り返しますか?

  for key,value in myTable do --pseudocode
        value = "foobar"
  end

また、それが助けになれば、私は本当にキーを気にせず、価値だけを気にします。

18
sFuller

値を持たない(つまり、nilである)キーは存在しません。 myTableは、Luaに関する限り、テーブルです。

空のテーブルを反復処理できますが、それは役に立たないでしょう。

さらに:

for key,value in myTable do --pseudocode
    value = "foobar"
end

この「擬似コード」は意味がありません。ローカル変数の内容を変更してテーブルを変更することはできません。 Luaはそのようには機能しません。テーブルエントリへの参照を取得することはできません。テーブルからvalueのみを取得できます。

テーブルの内容を変更する場合は、実際にテーブルを変更する必要があります。例えば:

for key,value in pairs(myTable) do --actualcode
    myTable[key] = "foobar"
end

myTableの使用に注意してください。ある時点でテーブル自体を使用せずにテーブルを変更することはできません。 myTableを介して、またはテーブルへの参照を格納する他の変数を介してアクセスされるテーブルであるかどうか。

一般に、繰り返し処理中にテーブルを変更すると、問題が発生する可能性があります。ただし、Luaは次のように述べています。

nextの動作は、トラバース中に、テーブル内の存在しないフィールドに値を割り当てた場合、未定義です。ただし、既存のフィールドは変更できます。特に、既存のフィールドをクリアできます。

したがって、すでに存在するフィールドの値を変更することは完全に有効です。また、keyは明らかにテーブルにすでに存在するため、変更できます。問題なくnilに設定することもできます。

Luaの変数は、値の保持者にすぎません。テーブルには値が含まれます。 myTable[key]は値を返します。その値を変数に保存できますが、変数を変更するとnotmyTable[key]の値を変更します。テーブルは参照によって保存されるため、ある変数のテーブルの内容を変更して別の変数の変更を確認できますが、それはテーブル自体ではなく、単にテーブルのcontentsです。

44
Nicol Bolas