# Tablolar - Hashmap Kullanımı

- **İngilizce aslı:** https://wiki.facepunch.com/gmod/List-Styled_Tables
- **Çeviri tarihi:** 2025-09-08

## 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:

```lua
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.

```lua
---
--- 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:

```lua
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!

```lua
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!

```lua
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.

```lua
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?

```lua
local function GetCreate()
    return "Create"
end

local pnl = vgui.GetCreate()("DPanel")
```

Bu mantıklı değil!

### ipairs

[ipairs](https://gmod.tr/wiki/Global.ipairs) yineleyici (iterator) fonksiyonu, [pairs](https://gmod.tr/wiki/Global.pairs) ile tamamen aynı şekilde kullanılır, ancak [ipairs](https://gmod.tr/wiki/Global.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.

```lua
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](https://gmod.tr/wiki/Global.pairs) kullanmak.
2. Başlangıçta sıralı tabloda `nil` olmasına izin vermemek. [table.remove](https://gmod.tr/wiki/table.remove) fonksiyonunu deneyin.

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/List-Styled_Tables
