0Pricing
Lua Academy · Ders

İç İçe Tablolar ve Yapılandırılmış Veriler

İç içe yapılar oluşturun ve derin alanlara erişin.

İç İçe Tablolar ve Yapılandırılmış Veriler, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.

İç İçe Tabloların Temelleri

Tablolar, değer olarak başka tablolar içerebilir ve istenen derinlikte yapılar oluşturabilir. Noktaları veya köşeli parantezleri zincirleyerek iç içe alanlara erişin. Eksik ara tablolar hatalara neden olur; derin alanlara erişmeden önce üst tabloların var olduğundan her zaman emin olun.

local company = {
  name = "CoddyKit",
  address = {
    city = "Istanbul",
    country = "Turkey",
    zip = "34000"
  },
  employees = 25
}

print(company.name)            -- CoddyKit
print(company.address.city)    -- Istanbul
print(company["address"]["zip"]) -- 34000

Güvenli Derin Erişim

Nil bir değerin alanına erişmek "attempt to index a nil value" hatasıyla programın çökmesine neden olur. and kısa devresinden yararlanarak buna karşı koruma sağlayın: t and t.a and t.a.b. Bazı kod tabanları, anahtar zincirlerini güvenle dolaşan bir get(t, ...) yardımcı işlevi tanımlar.

local function get(t, ...)
  local cur = t
  for _, key in ipairs({...}) do
    if type(cur) ~= "table" then return nil end
    cur = cur[key]
  end
  return cur
end

local data = {user = {profile = {age = 30}}}
print(get(data, "user", "profile", "age"))    -- 30
print(get(data, "user", "missing", "field"))  -- nil

Kayıtlar Dizisi

Yaygın bir örüntü, tablolardan oluşan bir dizidir (kayıtlar). Her öğe, adlandırılmış alanlara sahip bir tablodur. ipairs ile dolaşın ve alanlara adlarıyla erişin. Bu, Lua'da nesneler dizisinin veya yapı listelerinin karşılığıdır.

local users = {
  {id=1, name="Alice", score=95},
  {id=2, name="Bob",   score=87},
  {id=3, name="Carol", score=91},
}

for _, user in ipairs(users) do
  print(user.id, user.name, user.score)
end

İç İçe Tabloları Dinamik Olarak Oluşturma

İç tabloları gerektiğinde oluşturarak iç içe yapıları adım adım kurun. İçine ekleme yapmadan önce her zaman bir tablo başlatın. Yaygın bir hata, önce iç tabloyu oluşturmayı unutup ardından nil'i dizinlemeye çalışmaktır.

local tree = {}
tree.root = {value = 10}
tree.root.left = {value = 5}
tree.root.right = {value = 15}
tree.root.left.left = {value = 2}

print(tree.root.value)            -- 10
print(tree.root.left.value)       -- 5
print(tree.root.left.left.value)  -- 2

JSON Benzeri Yapılandırma Olarak Tablo

Lua tabloları, JSON veya YAML'a benzer şekilde yapılandırma dosyaları için sıkça kullanılır. Dosya bir tablo döndürür ve uygulama bu tabloyu dofile() veya require() ile yükler. İç içe tablolar, iç içe yapılandırma bölümlerini temsil eder.

-- config.lua (returned table)
local config = {
  server = {
    host = "0.0.0.0",
    port = 8080,
    ssl  = false,
  },
  db = {
    host = "localhost",
    name = "appdb",
    pool_size = 10,
  },
  logging = { level = "info", file = "/var/log/app.log" }
}

print(config.server.port)      -- 8080
print(config.db.pool_size)    -- 10

Komşuluk Listesi Olarak Çizge

Bir çizgeyi tablolar tablosu olarak temsil edin: Her anahtar bir düğümdür ve değeri komşuların listesidir. Bu komşuluk listesi gösterimi, seyrek çizgelerde bellek açısından verimlidir ve Lua'da kullanımı kolaydır.

local graph = {
  A = {"B", "C"},
  B = {"A", "D"},
  C = {"A", "D"},
  D = {"B", "C"},
}

-- BFS from A
local visited = {A=true}
local queue = {"A"}
while #queue > 0 do
  local node = table.remove(queue, 1)
  io.write(node .. " ")
  for _, neighbor in ipairs(graph[node]) do
    if not visited[neighbor] then
      visited[neighbor] = true
      queue[#queue+1] = neighbor
    end
  end
end
print()  -- A B C D

İç İçe Alanları Değiştirme

Üst tabloya erişip anahtara atama yaparak iç içe alanları değiştirin. Tablolar başvuru ile aktarıldığından, bir tablo alan her işlev içeriği doğrudan değiştirebilir; çağıran taraf değişiklikleri görür.

local player = {name="Hero", stats={hp=100, mp=50, atk=20}}

local function takeDamage(p, dmg)
  p.stats.hp = math.max(0, p.stats.hp - dmg)
end

takeDamage(player, 35)
print(player.stats.hp)   -- 65

player.stats.atk = player.stats.atk + 5
print(player.stats.atk)  -- 25

İç İçe Tabloları Serileştirme

İç içe bir tabloyu dizeye dönüştürmek hata ayıklama veya günlük kaydı için kullanışlıdır. Basit bir özyinelemeli serileştirici her derinliği işleyebilir, ancak döngüleri (dairesel başvuruları) işleyemez.

local function serialize(val, indent)
  indent = indent or 0
  local pad = string.rep("  ", indent)
  if type(val) ~= "table" then
    return tostring(val)
  end
  local parts = {"{"}
  for k, v in pairs(val) do
    parts[#parts+1] = pad.."  "..tostring(k).."="..serialize(v,indent+1)
  end
  parts[#parts+1] = pad.."}"
  return table.concat(parts, "\n")
end
local data = {x=1, nested={y=2, z=3}}
print(serialize(data))

Seyrek Matrisler

2B matrisi doğrudan depolamak, büyük ve seyrek girdilerde belleği boşa harcar. İç içe bir tabloda yalnızca sıfır olmayan girdileri depolayın: matrix[row][col] = value. Bu yöntem, değerlerin çoğu sıfır olduğunda çok büyük matrisleri verimli şekilde temsil edebilir.

local function newMatrix()
  return setmetatable({}, {__index=function(t,k)
    local row = {}
    rawset(t, k, row)
    return row
  end})
end

local m = newMatrix()
m[1][1] = 5
m[3][7] = 12
m[100][200] = 99

print(m[1][1])    -- 5
print(m[3][7])    -- 12
print(m[2][5])    -- nil (sparse: no value)

Derin Eşitlik Denetimi

Tablolar == ile değere göre değil, başvuruya göre karşılaştırılır. İç içe tabloları yapısal olarak karşılaştırmak için her anahtar-değer çiftini karşılaştıran ve iç içe tablolarda özyinelemeli olarak çalışan bir eşitlik işlevi yazın.

local function deepEqual(a, b)
  if type(a) ~= type(b) then return false end
  if type(a) ~= "table" then return a == b end
  for k, v in pairs(a) do
    if not deepEqual(v, b[k]) then return false end
  end
  for k in pairs(b) do
    if a[k] == nil then return false end
  end
  return true
end
print(deepEqual({1,{2,3}},{1,{2,3}}))  -- true
print(deepEqual({1,{2,3}},{1,{2,4}}))  -- false

Hızlı Kontrol

t.a değeri nil olduğunda t.a.b erişimi yapılırsa ne olur?

Özet: İç İçe Tablolar

Özet:

  • Tablolar istenen derinlikte iç içe olabilir: t.a.b.c
  • Derin erişimi koruyun: t and t.a and t.a.b
  • Tablolar başvuru türleridir; işlevler içeriği doğrudan değiştirir
  • Kayıtlar dizisi: {{name=...},{name=...}}
  • Seyrek matris: bellek verimliliği için iç içe tablolar
  • Derin eşitlik özyinelemeli karşılaştırma gerektirir

Sıkça Sorulan Sorular

“İç İçe Tablolar ve Yapılandırılmış Veriler” dersi ücretsiz mi?

Evet — “İç İçe Tablolar ve Yapılandırılmış Veriler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.

“İç İçe Tablolar ve Yapılandırılmış Veriler” dersinde ne öğreneceğim?

İç içe yapılar oluşturun ve derin alanlara erişin. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Lua Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“İç İçe Tablolar ve Yapılandırılmış Veriler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Diziler Olarak Tablolar
  2. Sözlükler Olarak Tablolar
  3. Tabloları pairs ve ipairs ile Yineleme
  4. İç İçe Tablolar ve Yapılandırılmış Veriler
← Lua Academy Sayfasına Dön