0

次の表があります。

self.keytable = {}
self.keytable.rotate_right = false
self.keytable.rotate_left = false
self.keytable.thrust = false
self.keytable.brake = false
self.keytable.fire = false

テーブルを反復処理して各値を false に設定したいのですが、Lua のニュアンスが欠けているに違いありません。私は運なしで次のことを試しました:

for k,v in ipairs(self.keytable) do
    v = false
end

助けてくれてありがとう!

4

3 に答える 3

5

テーブルを反復処理して各値を false に設定したいのですが、Lua のニュアンスが欠けているに違いありません。私は運なしで次のことを試しました:

for k,v in ipairs(self.keytable) do  
    v = false  
end  

これがうまくいかない理由は簡単にわかりますか?

local v = self.keytable[rotate_right]
v = false

の値を にコピーしself.keytable[rotate_right]ますv。その後、別の値を に書き込んでも、 の値にvは影響しませんkeytable

これはまさに for ループで起こっていることであり、これと同等です。

for k=1,#self.keytable do
    local v = self.keytable[k]
    v = false
end

の値を更新する場合は、次のkeytableように記述する必要があります。

for k=1,#self.keytable do
    self.keytable[k] = false
end

または、(元のループのように) ipairs を使用している場合:

for k,v in ipairs(self.keytable) do
    self.keytable[k] = false
end
于 2012-12-05T22:34:29.147 に答える
2

ここで何を意図しているのか正確にはわかりませんが、整数以外のキーを使用する場合は、pair() 組み込み関数を使用する必要があります。ipairs() は、数値キーを持つテーブルを反復処理するためのものであり、上記の例では、keytable の数値以外のキーに false を割り当てています。

コード例で行ったように、キーテーブルの各キーを false に設定する必要がないようにしたい場合は、次のようにして、少しすっきりさせます。

local keytable = {}
local keys = {"rotate_right", "rotate_left", "thrust", "brake", "fire"}

for _,key in pairs(keys) do
    keytable[key] = false
end

これにより、印刷時に次の出力が生成されます。

thrust  false
brake   false
fire    false
rotate_left false
rotate_right    false

上記のコードは、文字列値を繰り返し処理し、それらを keytable のキーとして設定し、値 false を割り当てます。

于 2012-12-05T21:56:31.710 に答える
1

他の2つの答えはどちらも正しいです。

1)ipairs整数キーを反復処理します (とにかく忘れてください。数値の for ループよりも優れているわけではありません)。ここでは、キーは文字列であるため、使用する必要がありますpairs。これで書き直した例を次に示します。

for k,v in pairs(self.keytable) do
  v = false
end

v2) Mud:がループに対してローカルであるという理由により、これはまだ機能しません。実際にはまったく必要ありません。正しいバージョンは次のとおりです。

for k in pairs(self.keytable) do
  self.keytable[k] = false
end
于 2012-12-06T10:04:45.780 に答える