Menu
Coddy logo textTech

Dizin İmzaları (Index Signatures)

Coddy'nin Lua Journey'sinin Luau'ya Giriş bölümünün bir parçası — ders 72 / 73.

Tablolar bölümünde {[string]: number} gibi harita (map) türleriyle karşılaşmıştınız — bu bir index signature'dır: herhangi bir string anahtarı (key) bir number değerine eşlenir. Bunlar, siz kodu yazarken anahtarların henüz bilinmediği durumlarda parlar: sayaçlar, ayarlar, önbellekler, skorlar — çalışma zamanında (runtime) oluşturulan her şey.

type Counts = {[string]: number}

local counts: Counts = {}
counts["potion"] = 3   -- herhangi bir dize anahtarına izin verilir
counts["sword"] = 1
counts["potion"] += 1  -- değerler sayı olarak kontrol edilir

Haritalarla çalışırken iki çalışma zamanı gerçeği önemlidir. İlki, hiç ayarlanmamış bir anahtarı okumak nil döndürür — klasik sayma kalıbı bunu or ile ele alır ve "eksik" olanı 0 değerine dönüştürür:

counts[item] = (counts[item] or 0) + 1

İkincisi, pairs() bir haritanın anahtarlarını garanti edilen bir sıra olmadan yineler — aynı programı iki kez çalıştırmak anahtarları farklı sıralarla ziyaret edebilir. Çıktının öngörülebilir olması gerektiğinde, anahtarları bir dizide (array) toplayın, table.sort ile sıralayın ve bunun yerine sıralanmış diziyi yineleyin:

local keys: {string} = {}
for key in pairs(counts) do
    table.insert(keys, key)
end
table.sort(keys)
for _, key in ipairs(keys) do
    print(`{key}: {counts[key]}`)
end
challenge icon

Görev

Kolay

Türlü bir map ile ganimet düşüşlerini sayın.

  • type Counts = {[string]: number} tanımlayın.
  • Her string'in kaç kez göründüğünü sayan yeni bir Counts haritası oluşturan countItems(items: {string}): Counts fonksiyonunu yazın ((counts[item] or 0) + 1 desenini kullanın).
  • local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"} oluşturun ve bunu sayın.
  • Farklı her öğe için alfabetik sırada tek bir [name]: [count] satırı yazdırın: anahtarları toplayın (collect), onları table.sort ile sıralayın, ardından yazdırın.

Beklenen çıktı:

potion: 3
shield: 1
sword: 2

Kendin dene

-- Kodu buraya yaz
-- 1) type Counts = {[string]: number}
-- 2) countItems(items: {string}): Counts (counts[item] or 0) + 1 kullanarak
-- 3) görevdeki loot dizisini say
-- 4) anahtarları topla, table.sort ile sırala, `{name}: {count}` satırlarını yazdır
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Luau'ya Giriş bölümündeki tüm dersler