İç İç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"]) -- 34000Gü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")) -- nilKayı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) -- 2JSON 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) -- 10Komş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}})) -- falseHı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
- Diziler Olarak Tablolar
- Sözlükler Olarak Tablolar
- Tabloları pairs ve ipairs ile Yineleme
- İç İçe Tablolar ve Yapılandırılmış Veriler