25

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

myTable = { myValue = nil, myOtherValue = nil}

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

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

また、それが役立つ場合、キーはあまり気にせず、値だけを気にします。

4

1 に答える 1

55

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

空のテーブルを反復処理することはできますが、それは役に立ちません。

さらに:

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

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

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

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

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

一般に、テーブルを反復処理しながらテーブルを変更すると、問題が発生する可能性があります。しかし、ルアは言います:

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

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

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

于 2012-10-26T06:14:36.410 に答える