Demet, tek bir ifade olarak ele alınan iki veya daha fazla ifadenin gruplandırılmış halidir.
Demet literal () arasında öğeleri virgülle ayrılmış birden fazla ifadeye sahiptir:
(1, 2, 3)
Bir demet içindeki öğelerin sırası önemlidir. Aşağıdaki demet, önceki demet örneğinden farklıdır:
(3, 2, 1)
Aynı ifade, bir demet içinde birden fazla konumunda da olabilir:
("Bana yardım et Rhonda", “Yardım et", "Bana yardım et Rhonda")
Demet ifadeleri herhangi bir türde olabilir ve (yalnızca bir türden öğe içerebilen dizilerin aksine) karışık türlere sahip olabilir:
(1, 2,0, "üç")
Demetler başka demetler de içerebilir:
(1, (10, 20.0, "otuz"), "üç")
Bu terimlere aşina iseniz, bir demet şuna benzer:
- İsimsiz sıralı öğelere sahip isimsiz bir veri yapısı
- Her bir öğesi farklı türde olabilen sabit boyutlu bir dizi
Demetler özellikle aşağıdaki durumlarda faydalıdır:
- Bir işlevden birden fazla değer döndürürken.
- Tam olarak tanımlanmış, yeniden kullanılabilir bir veri yapısı (yapı veya sınıf gibi) oluşturmanın getirdiği yük yerine daha basit ve yerinde bir gruplandırma.
Demet Türüne Sahip Bir Değişken Belirtme
Değişken türünü bir demet olarak belirtmek için, “()” içine alınmış ve virgülle ayrılmış türlerden önce “demet” öneki kullanılır:
MyTupleInts : tuple(int, int, int) = (1, 2, 3)
MyTupleMixed : tuple(int, float, string) = (1, 2.0, “üç")
MyTupleNested : tuple(int, tuple(int, float, string), string) = (1, (10, 20.0, “otuz"), “üç")
Tuple türleri ayrıca çıkarılabilir:
MyTupleInts := (1, 2, 3)
MyTupleMixed := (1, 2.0, "three")
MyTupleNested := (1, (10, 20.0, "thirty"), "three")
Demet türü belirticiler veri üyelerinde ve fonksiyon türü imzalarında parametreler veya dönüş türü için kullanılabilir:
ExampleFunction(Param1 : tuple(string, int), Param2 : tuple(int, string)) : tuple(string, int) =
# Parametreyi sonuç olarak kullanma
Param1
Demet Öğesi Erişimi
Bir demetin öğelerine bir tamsayı alan, başarısız olmayan, sıfır tabanlı bir dizin operatörü ile erişilebilir. Dizin operatörü başarısız olamaz (başarısız olabilen “[dizin]” dizi operatörünün aksine) çünkü derleyici her zaman herhangi bir demetin öğe sayısını bilir ve bu nedenle herhangi bir sınır dışı dizin derleme zamanı hatası verecektir:
MyTuple := (1, 2.0, "three")
MyNestedTuple := (1, (10, 20.0, "thirty"), "three")
var MyInt: int = MyTuple(0)
var MyFloat: float = MyTuple(1)
var MyString: string = MyTuple(2)
Print("Değişkenlerim: {MyInt}, {MyFloat}, {MyString}")
Print("İç içe geçmiş demet öğem: {MyNestedTuple(1)(2)}")
Demet Dizi Zorlaması
Demetler, demet öğelerinin türleri dizi ile aynı türde olmak şartıyla bir dizinin beklendiği her durumda geçirilebilir. Bir demetin beklendiği durumlarda diziler geçirilemez.
Demet Genişlemesi
Tek bir öğe olarak bir fonksiyona gönderilen bir demet, sanki fonksiyon demetin her bir öğesi ile ayrı ayrı çağrılmış gibi davranır. Buna demet genişlemesi veya yayılma adı verilir.
F(Arg1 : int, Arg2 : string) : void =
DoStuff(Arg1, Arg2)
G() : void =
MyTuple := (1, "two")
F(MyTuple(0), MyTuple(1)) # Öğelere erişme
F(MyTuple) # Demet genişletme
“senk” yapılandırılmış eşzamanlılık ifadesi, zaman içinde değerlendirilen birkaç argümanın aynı anda değerlendirilmesine izin veren bir demet sonucuna sahiptir. Daha fazla bilgi için Eşzamanlılık bölümüne bakabilirsin.
Kalıcı Tür
Bir demet, demetteki her öğe türü kalıcı ise kalıcıdır. Bir demetin kalıcı olması, bunları modül kapsamındaki “weak_map” değişkenlerinde kullanabileceğin ve değerlerini oyun oturumları arasında kalıcı olmasını sağlayabileceğin anlamına gelir. Verse’te kalıcılık hakkında daha ayrıntılı bilgi için Verse’te Kalıcı Veriler Kullanma bölümüne bak.