Tablolar - Hashmap Kullanımı
Dizileri Hashmap'lerle Değiştirme
Lua'da bir tablo (table), temel olarak iki bileşenden oluşur.
- Bir dizi (liste veya sıralı tablo olarak da adlandırılır)
- Bir hashmap (sözlük olarak da adlandırılır)
Dizi, doğrusal bir eleman dizisidir, örneğin:
Gördüğünüz gibi, sadece elemanları tanımlıyoruz ve dilin bizim için anahtarları belirlemesine izin veriyoruz. Bu, bu veriyi almak için mutlaka belirleyici bir yolunuzun olmadığı durumlarda kullanışlıdır. Örneğin, aşağıdaki dizi tanımında "Jeff" adlı oyuncuyu bulmak isteseydik.
Aşağıdakini yapabilirdik:
Ancak bu biraz hantal görünüyor, değil mi? Sadece bir kişiyi bulmak için neden array içindeki her bir kişinin üzerinden geçmek zorundayız! Bu, çoğu durumda performanslı olsa ve sorunsuz çalışsa da, neden daha kolay bir yolu yok?... Aslında var! İşte bu noktada hashmap'ler devreye giriyor!
Bunun biraz farklı yapılandırıldığını hayal edin; oyuncu indeksinin, tabloda nerede/ne zaman tanımlandığına bağlı olmak yerine, ismin kendisi olduğunu!
Oyuncuyu bulmak için eski çözümle neredeyse aynı şekilde ele alabileceğiniz düşünüldüğünde bu zararsız bir değişiklik gibi görünebilir, ancak bu tamamen yeni bir yol açar!
Döngüye gerek yok, bu da hayatı önemli ölçüde kolaylaştırıyor çünkü artık değerleri döndürecek bir fonksiyona veya döngüden sonra bulunan oyuncuyu atayacak geçici bir değişkene ihtiyaç duymadan bulabilirsiniz.
Notlar
Nokta ve Köşeli Parantez Karşılaştırması
Yukarıda okuduğunuz gibi, Jeff'i tablodan almak için hash["Jeff"] yaptık, ancak API'nin her yerinde bir tablodan bir şey alırken vgui.Create yaparsınız, vgui["Create"] değil... Değil mi? Aslında ikisi de aynı şeydir, tek fark sözdizimi ve birinin sihirli bir gücü olmasıdır. Bu güç, sabit bir değer yerine indekslemek için bir "İfade" (bir şey döndüren bir kod parçası) kullanmanıza izin verir, yani.
Evet, bu durumda işe yaramaz; ancak bu son derece güçlüdür, muhtemelen hashmap'lerin en güçlü özelliğidir. Değerleri dinamik olarak indekslemenize izin vermesi, kullanıcı girdisini kullanarak bir değer bulmanızı, bir oyuncuyu yalnızca çalışma zamanında (runtime) bilebileceğiniz içsel değerleriyle almanızı vb. sağlar. Aşağıdakini yapamazdınız, değil mi?
Bu mantıklı değil!
ipairs
ipairs yineleyici (iterator) fonksiyonu, pairs ile tamamen aynı şekilde kullanılır, ancak ipairs yalnızca sıralı (sequential) anahtarlar arasında döngü kurar. Yani, bir tablonun sıralı kısmında nil ile karşılaşırsa, döngüyü durdurur.
Bu, A B D değil, A B çıktısı verir, çünkü 3. anahtarda nil ile karşılaşmıştır. Bunun çözümü şunlardır:
nilolmayan her şeyin üzerinden durmadan geçen pairs kullanmak.- Başlangıçta sıralı tabloda
nilolmasına izin vermemek. table.remove fonksiyonunu deneyin.
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord