Bir lua tablosu girişi anahtarı ile nasıl kaldırılır?


99

Hashmap olarak kullandığım bir lua tablom var, yani string anahtarları olan:

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

Bu tablonun anahtarıyla tanımlanan bir öğesini "pop" yapmak istiyorum. Bir table.remove()yöntem vardır, ancak genel bir anahtar değil, yalnızca kaldırılacak öğenin dizinini (yani bir sayı) alır. Yapabilmek isterim table.remove(map, 'foo')ve işte bunu nasıl uyguladım:

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

Bunu yapmanın daha iyi bir yolu var mı?


4
Çok faydalı soruya +1, çünkü ihtiyacım olan "cevabı" verdin; "daha iyi" bir yol olmasa bile.
Ian Boyd

Yanıtlar:


87

Hayır, anahtarın değerini olarak ayarlamak, niltablonun hashmap bölümündeki bir öğeyi kaldırmanın kabul edilen yoludur. Yaptığınız şey standart. Ancak, geçersiz table.remove()kılmamanızı tavsiye ederim - bir tablonun dizi bölümü için varsayılan table.remove () işlevi, geçersiz kılmanızın yapmayacağı dizinleri yeniden numaralandırmayı içerir. İşlevinizi tableişlev kümesine eklemek istiyorsanız , muhtemelen ona benzer bir ad vereceğim table.removekey().


Silme işlemiyle ilgili geri bildiriminiz için teşekkür ederiz. Fonksiyonun adı hakkında, bu esas olarak amacımı netleştirmek içindi. Genelde standart işlevleri geçersiz kılmam. Kesinlikle bu isim altında kullanmayacağım ( table.removekey()en iyi seçimim de olur).
Wookai

1
Yalnızca tek bir blok içinde kullanıyorsanız, bunun yerine yerel bir işlev yaparak performans açısından daha da iyi olursunuz (her arama için genel bir aramanın ek yükünden tasarruf sağlar). Oldukça sık ithal table.insertve table.removeyerel ad içine sık sık benzeri bir şey olarak, sık sık onları kullanıyorum eğer tinsert()ve tremove().
Amber

Performans ipucu için teşekkürler. Bunun büyük bir fark yaratıp yaratmadığını görmek için sık kullandığım işlevleri yerel ad alanına aktarmaya çalışacağım.
Wookai

İndekslerin küçültülmesi ve bu nedenle elemanların yeniden konumlandırılması için boş olarak ayarlamak yerine table.remove (indez, position) kullanmanız gerektiğini unutmayın.

@HakanBoztepe Tablonun hashmap kısmı (string anahtarları) ile ilgili değil.
Amber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.