Kavramlar - Tablolar ve Diziler

Tablolar Nedir?

Tablolar, bir kap gibi, içlerinde birden fazla değer saklamanıza olanak tanıyan değişkenlerdir. Tablolar, tıpkı bir sözlüğün tanımları (değerler) belirli kelimelerle (anahtarlar) eşleştirmesi gibi, değerleri belirli anahtarlarla eşleştirme yeteneği sağlar.

Sözlük örneğini takip edersek, herhangi bir sözlükteki herhangi bir kelimeye bakıp karşılığında tanımını alabilirsiniz, aynı şekilde bir tablodaki bir anahtara bakıp o anahtarın içinde veya üzerinde saklanan değeri alabilirsiniz.

Sıralı tablolar, diziler, listeler

Sıralı tablo, anahtarların 1'den başlayan, sürekli artan ve boşluk içermeyen sayılar olduğu bir tablodur. Bu, diğer programlama dillerinde "Dizi" (Array) veya "Liste" (List) olarak bilinir. Lua'da böyle bir ayrım yoktur.

Anahtarlar (Keys)

Anahtarlar, değerler için tanımlayıcılardır ve herhangi bir girdinin "indeksi" (index) olarak bilinirler. Bir tablodaki girdilere "anahtar/değer çiftleri" (key/value pairs) de denilebilir.

Anahtarlar birden çok şekilde kullanılabilir. Anahtarlar sayısal olabilir ve/veya bir şeylerin sırasını temsil edebilir, yani:

local myTable = { [1] = "myValue", [2] = "myValue2", [3] = "myValue3", [4] = "myValue4", [5] = "myValue5", -- ve bu şekilde devam eder... } -- Veya basitçe bu şekilde local myTable = { "myValue", "myValue2", "myValue3", "myValue4", "myValue5", -- ve bu şekilde devam eder... }

Anahtarlar ayrıca şu şekilde dizeler (string) de olabilir:

local myTable = { ["String1"] = "My Value 1", ["AnotherOne"] = "Awesome Value", ["EvenMore"] = 5, -- ve bu şekilde devam eder... }

Bir şeylerin sırasını temsil etmek için kullanıldığında anahtarlar, bir tablonun diğer dillerdeki list veya hatta array nesneleri gibi daha çok işlev görmesini sağlar - anahtarlar sayısal ve sıralıdır (düzenlidir). Anahtar olarak dizeler (veya diğer türler) kullanıldığında, tablolar daha çok bir dictionary (sözlük) veya hash map nesnesi gibi kullanılabilir. Tüm bunların en iyi yanı, Lua'daki tabloların bu tür 'modların' her ikisini de aynı anda kullanabilmesidir!

Ancak, anahtar olarak yalnızca sayılar veya dizeler kullanılamaz - nil hariç her tür değişken olabilirler. Yine de çoğu zaman, genellikle sayı veya dize olarak tanımlanırlar.

Bir tablodaki her anahtar için yalnızca bir değer olabilir - anahtarlar benzersiz olmalıdır. Belirli bir anahtarda birden fazla değer saklamanın tek yolu, değer olarak yeni bir tablo kullanmaktır. Bu teknik olarak hala yalnızca bir değerdir - tablo tek bir değer olarak sayılır, ancak içinde başka şeyler saklanabilir. Bu tablo-içinde-tablo senaryosuna "iç içe geçmiş" (nested) tablo denir.

Değerler (Values)

Değerler herhangi bir veri türü olabilir - hatta diğer tablolar bile!

Tablo oluşturma örneği

-- Burada, "tablo oluşturucuyu" ( {} ) kullanarak boş bir tablo oluşturuyoruz emptyTable = {} -- Önceden tanımlanmış değerlerle bir tablo oluşturabiliriz: table1 = { [1] = "First", [2] = "Second", } -- (Her 'anahtar = değer' satırından sonra virgül koymayı unutmayın.) -- Ayrıca Lua'nın sayısal "sıra" değerlerini otomatik olarak doldurmasını sağlayabiliriz: table1 = { "First", "Second" } -- table1 daha sonra [1] = First ve [2] = Second değerlerini içerecektir. -- Tablomuzda dize anahtarlarını iki farklı şekilde tanımlayabiliriz: -- Birincisi, kısa yol: table1.SomeStringKey = "Hello!" -- veya, uzun yol: table1["SomeStringKey"] = "Hello!" -- Bu yöntemlerin her ikisini de sözlü olarak tanımlamak için şunu söyleyebiliriz: -- "table1'in SomeStringKey'i EŞİTTİR Hello!"

Bir tablo üzerinde döngü kurma

Bir tablodaki tüm anahtar/değer çiftleri üzerinde döngü kurmanın birkaç yolu vardır. Kullanacağınız yöntem, anahtarların nasıl düzenlendiğine bağlı olacaktır.

Eğer Lua, son örnekteki gibi sayısal "sıra" anahtarlarınızı otomatik olarak doldurduysa, tabloyu döngüye almak için bir for döngüsü kullanabilirsiniz.

Eğer sayısal anahtarlarla tanımlanmamış herhangi bir anahtar varsa, yani dize anahtarları gibi, veya sayısal anahtar(lar)ı "sırasız" veya boşluklu tanımladıysanız, tüm tablo üzerinde döngü kurmak için pairs kullanmanız gerekecektir.

pairs, sayısal/sıra anahtarları VE dize (veya diğer tür) anahtarları da dahil olmak üzere tablodaki tüm değerler üzerinde döngü kurar; diğer dillerde bu, bir for each döngüsü gibidir.

-- Tablomuzu, otomatik sayısal/sıra anahtar yöntemini kullanarak yeniden tanımlayalım: table1 = { "First", "Second", "Third" } -- Şimdi, az önce oluşturduğumuz aynı tabloyu alıp, tablo üzerinde bir dize anahtarı tanımlayacağım. table1.StringKey = "Fourth?" -- StringKey'i tabloya koymadan önce, sadece bir for döngüsü kullanabilirdik, çünkü -- tüm anahtarlar otomatik olarak sıralı sayılar olarak tanımlanmıştı. -- Ancak, şimdi tabloda bir StringKey olduğu için, döngü kurmak için pairs() kullanmamız gerekiyor -- çünkü bir for döngüsü StringKey girdisini "almaz". -- Sayısal değerler üzerinde döngü kurmak için bir for döngüsü kullanalım. -- 'i' değişkeni anahtarımız olarak işlev görecek ve karşılık gelen değeri -- 'table1[i]' referansını kullanarak alabiliriz: for i=1, #table1 do print( i .. " == " .. table1[i] ) end -- Bu şunu yazdırmalı: -- 1 == First -- 2 == Second -- 3 == Third -- ...şimdi bunun pairs ile nasıl göründüğüne bakalım. for k, v in pairs( table1 ) do -- pairs döngüsünün içinde! -- Tablodaki her anahtarı ve karşılık gelen değerini yazdıralım. print( k .. " == " .. v ) end -- Bu şunu yazdırmalı: -- 1 == First -- 2 == Second -- 3 == Third -- StringKey == Fourth?

ipairs

pairs'in, ipairs adında, pairs'in yaptığı şeyin aynısını (bir tablodaki tüm anahtar/değer çiftleri üzerinde döngü kurar) yapan, ancak yalnızca sıralı tablolar için olan yerleşik bir kardeş fonksiyonu vardır.

Names = { [2] = "John", [1] = "Mary", [4] = "Mark", [3] = "Den" } -- Sayısal anahtarlı anahtar/değer çiftleri arasında döngü kurmak ve bunları yazdırmak için ipairs kullanın: for k,v in ipairs( Names ) do print( k.. " == " .. v ) end -- Bu, şu çıktıyı vermelidir: -- 1 == Mary -- 2 == John -- 3 == Den -- 4 == Mark

RandomPairs

RandomPairs, bir tablo üzerinde döngü kuran, ancak bunu rastgele bir sırada yapan Garry's Mod'a özgü bir fonksiyondur.

Names = { "John", "Mary", "Mark", "Den" } for k,v in RandomPairs(Names) do print( v ) end -- Bu, isimleri yazdıracaktır, ancak her seferinde rastgele bir sırada. -- Şöyle görünebilir: -- Den -- Mary -- Mark -- John -- Veya, şöyle görünebilir: -- John -- Den -- Mary -- Mark -- Ve bu şekilde devam eder.

SortedPairs

SortedPairs, bir tablodaki tüm anahtar/değer çiftleri üzerinde döngü kurmanıza izin veren, ancak anahtarları alfabetik olarak sıralayan başka bir Garry's Mod'a özgü fonksiyondur. Bu, en çok dize anahtarları olan tablolar için kullanışlıdır.

-- Tablomuzu alfabetik olmayan sıralı dize anahtarlarıyla bildirelim: Names = { E = 5, B = 2, A = 1, D = 4, C = 3, } -- Bu sefer SortedPairs ile döngü kurun ve standart 'k == v' yazdırma işlemini yapın for k,v in SortedPairs(Names) do print( k .. " == " .. v ) end -- Bu, şu çıktıyı vermelidir: -- A == 1 -- B == 2 -- C == 3 -- D == 4 -- E == 5 -- SortedPairs'in anahtarları nasıl alfabetik olarak sıraladığına dikkat edin.

Benzer şekilde SortedPairsByValue bir tablo üzerinde döngü kurmak için kullanılabilir, ancak anahtar yerine değere göre sıralanır.

table kütüphanesinin kullanımı

table kütüphanesi, tabloları yönetmek için fonksiyonlar sağlayan standart bir Lua kütüphanesidir. Garry's Mod'da bu kütüphaneye eklenmiş birkaç ekstra kullanışlı fonksiyon vardır. Bunlar, table kütüphanesinde tanımlanan fonksiyonlara bazı örneklerdir.

table.Merge

-- Meyvelerle dolu bir tablo tanımlıyoruz, Fruits = { "Apple", "Orange", "Banana", "Pineapple", } -- Ve sebzelerle dolu bir tablo. Veggies = { "Pepper", "Tomato" } -- 'Veggies' içindeki değerleri 'Fruits' tablosuna birleştirmek için table.Merge fonksiyonunu kullanacağız. table.Merge( Fruits, Veggies ) -- argümanlar: hedef, kaynak -- Bu çalıştığında: -- Veggies tablosundaki "Pepper" değeri, Fruits'teki "Apple" değerinin (anahtar '1') yerini alacak ve: -- Veggies tablosundaki "Tomato" değeri, Fruits'teki "Orange" değerinin (anahtar '2') yerini alacaktır. -- 'Fruits' içindeki tüm yeni değerleri yazdıralım: print( table.concat(Fruits," ") ) -- Bu, şu çıktıyı verecektir: -- Pepper Tomato Banana Pineapple

table.Add

-- Yine, Fruits ve Veggies tablolarımız var. Fruits = { "Apple", "Orange" } Veggies = { "Pepper", "Tomato" } -- Veggies'deki tüm değerleri Fruits tablosunun sonuna ekleyin: table.Add(Fruits, Veggies) -- argümanlar: hedef, kaynak print( table.concat(Fruits," ") ) -- Bu, şu çıktıyı verecektir: -- Apple Orange Pepper Tomato

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