Bagaimana cara menghapus entri tabel lua dengan kuncinya?

97

Saya memiliki tabel lua yang saya gunakan sebagai hashmap, yaitu dengan kunci string:

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

Saya ingin "memunculkan" elemen tabel ini yang diidentifikasi oleh kuncinya. Ada table.remove()metode, tetapi hanya membutuhkan indeks elemen untuk dihapus (yaitu angka) dan bukan kunci generik. Saya ingin dapat melakukannya table.remove(map, 'foo')dan inilah cara saya menerapkannya:

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

Apakah ada cara yang lebih baik untuk melakukan itu?

Wookai
sumber
4
+1 untuk pertanyaan yang sangat berguna karena Anda memberikan "jawaban" yang saya butuhkan; bahkan jika tidak ada cara yang "lebih baik".
Ian Boyd

Jawaban:

84

Tidak, menyetel nilai kunci ke niladalah cara yang diterima untuk menghapus item di bagian hashmap tabel. Apa yang Anda lakukan adalah standar. Namun, saya akan merekomendasikan untuk tidak menimpa table.remove()- untuk bagian array dari sebuah tabel, fungsionalitas table.remove () default mencakup penomoran ulang indeks, yang tidak akan dilakukan oleh penimpaan Anda. Jika Anda memang ingin menambahkan fungsi Anda ke tableset fungsi, maka saya mungkin akan menamainya seperti table.removekey()atau semacamnya.

Amber
sumber
Terima kasih atas umpan balik tentang penghapusan ini. Tentang nama fungsinya, ini terutama untuk memperjelas maksud saya. Saya biasanya tidak mengganti fungsi standar. Saya pasti tidak akan menggunakannya dengan nama itu ( table.removekey()akan menjadi pilihan terbaik saya juga).
Wookai
1
Jika Anda hanya menggunakannya dalam satu blok, Anda akan menjadi lebih baik dari segi kinerja hanya dengan menjadikannya sebagai fungsi lokal (menghemat overhead pencarian global untuk setiap panggilan). Saya cukup sering mengimpor table.insertdan table.removeke namespace lokal jika saya sering menggunakannya, sering sebagai sesuatu seperti tinsert()dan tremove().
Amber
Terima kasih atas tip performanya. Saya akan mencoba mengimpor fungsi yang sering saya gunakan ke namespace lokal untuk melihat apakah ini membuat perbedaan besar.
Wookai
Perhatikan bahwa Anda harus menggunakan table.remove (indez, position) daripada menyetelnya menjadi nil sehingga indeks akan berkurang dan karenanya elemen diposisikan ulang.
@HakanBoztepe Itu tidak relevan untuk bagian hashmap tabel (kunci string).
Amber