Tablolar - Hashmap Kullanımı

Dizileri Hashmap'lerle Değiştirme

Lua'da bir tablo (table), temel olarak iki bileşenden oluşur.

  1. Bir dizi (liste veya sıralı tablo olarak da adlandırılır)
  2. Bir hashmap (sözlük olarak da adlandırılır)

Dizi, doğrusal bir eleman dizisidir, örneğin:

local array = {"A", "B", "C"}

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.

--- --- Tablo, daha fazla tablodan oluşan doğrusal bir dizi içerir --- local array = { --- Oyuncu indeksi 1, çünkü tablodaki ilk eleman { "Goober", --- İsim 21, --- Para }, --- Oyuncu indeksi 2, ve bu şekilde devam eder { "Pedro", 42, }, { "Jeff", 32, }, { "Nyaaa", 2442242424, } }

Aşağıdakini yapabilirdik:

for k, v in pairs(array) do if v[1] != "Jeff" then continue -- Eğer ismi (ilk anahtar) Jeff değilse, bir sonraki döngü adımına geç end print("Jeff'in parası: $" .. v[2] .. "! Jeff'in oyuncu indeksi: " .. k) end

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!

local hash = { --- İsim = Para Goober = 21, Pedro, = 42, Jeff, = 32, Nyaaa, = 2442242424, }

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!

print("Jeff'in parası: $" .. hash["Jeff"] .. "!")

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.

local function GetCreate() return "Create" end local pnl = vgui[GetCreate()]("DPanel")

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?

local function GetCreate() return "Create" end local pnl = vgui.GetCreate()("DPanel")

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.

local array = { [1] = "A", [2] = "B", -- [3] = nil, [4] = "D" } for k, v in ipairs(array) do print(v) end

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:

  1. nil olmayan her şeyin üzerinden durmadan geçen pairs kullanmak.
  2. Başlangıçta sıralı tabloda nil olmasına izin vermemek. table.remove fonksiyonunu deneyin.

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord