キーでluaテーブルエントリを削除する方法


94

ハッシュマップとして使用するluaテーブルがあります。つまり、文字列キーを使用します。

local map = { foo = 1, bar = 2 }

キーで識別されるこのテーブルの要素を「ポップ」したいと思います。table.remove()メソッドはありますが、削除する要素のインデックス(つまり、数値)のみを受け取り、汎用キーは受け取りません。私はできるようになりたいと思いますtable.remove(map, 'foo')、そしてここに私がそれをどのように実装したかがあります:

function table.removekey(table, key)
    local element = table[key]
    table[key] = nil
    return element
end

それを行うより良い方法はありますか?


4
あなたが私が必要とする「答え」を与えたので、非常に役立つ質問に+1してください。「より良い」方法がなくても。
Ian Boyd、

回答:


82

いいえ、キーの値をに設定するnilことは、テーブルのハッシュマップ部分のアイテムを削除するための受け入れられている方法です。あなたがしていることは標準です。ただし、オーバーライドしないことをお勧めします。table.remove()テーブルの配列部分の場合、デフォルトのtable.remove()機能にはインデックスの再番号付けが含まれますが、オーバーライドでは行われません。関数をtable関数セットに追加したい場合は、おそらくそのような名前を付けtable.removekey()ます。


削除についてのフィードバックをありがとう。関数の名前については、主に私のポイントを明確にするためでした。私は通常、標準関数をオーバーライドしません。私は間違いなくその名前でそれを使用しません(table.removekey()私の最善の選択も)。
ウーカイ2009年

1
単一のブロック内でのみ使用している場合は、代わりにローカル関数にすることで、パフォーマンスを向上させることができます(各呼び出しのグローバルルックアップのオーバーヘッドを節約できます)。ローカルネームスペースを頻繁に使用している場合、ローカルネームスペースにインポートtable.inserttable.removeたり、頻繁に使用しtinsert()たりしtremove()ます。
アンバー

パフォーマンスのヒントをありがとう。私がよく使用する関数をローカル名前空間にインポートして、これが大きな違いを生むかどうかを確認します。
ウーカイ2009年

nilに設定する代わりにtable.remove(indez、position)を使用する必要があることに注意してください。そうすることで、インデックスが減分され、要素が再配置されます。

@HakanBoztepeこれは、テーブルのハッシュマップ部分(文字列キー)には関係ありません。
2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.