Dart Tipler | Records— Kayıtlar #7

MÜŞERREF SELÇUK ÖZDEMIR
3 min readDec 20, 2023

--

Kayıtlar anonim, değişmez bir toplama türüdür. Diğer koleksiyon türleri gibi, birden fazla nesneyi tek bir nesnede bir araya getirmenizi sağlar. Diğer koleksiyon türlerinin aksine, kayıtlar sabit boyutlu, heterojen ve tiplidir.

Kayıtlar gerçek değerlerdir; onları değişkenlerde saklayabilir, iç içe yerleştirebilir, işlevlere ve işlevlerden geçirebilir ve listeler, eşlemeler ve kümeler gibi veri yapılarında saklayabilirsiniz.

Record syntax

Kayıt ifadeleri, parantez içine alınmış, adlandırılmış veya konumsal alanların virgülle ayrılmış listeleridir:

var record = ('first', a: 2, b: true, 'last');

Kayıt türü ek açıklamaları, parantez içine alınmış türlerin virgülle ayrılmış listeleridir. Dönüş türlerini ve parametre türlerini tanımlamak için kayıt türü ek açıklamalarını kullanabilirsiniz. Örneğin, aşağıdaki (int, int) ifadeleri kayıt tipi ek açıklamalarıdır:

(int, int) swap((int, int) record) {
var (a, b) = record;
return (b, a);
}

Kayıt ifadelerindeki ve tür ek açıklamalarındaki alanlar, parametrelerin ve argümanların fonksiyonlarda nasıl çalıştığını yansıtır. Konumsal alanlar doğrudan parantezlerin içine girer:

// Bir değişken bildiriminde tür ek açıklamasını kaydedin:
(String, int) record;

// Bir kayıt ifadesiyle başlatın:
record = ('A string', 123);

Bir kayıt türü açıklamasında, adlandırılmış alanlar, tüm konumsal alanlardan sonra, tür ve ad çiftlerinden oluşan küme paranteziyle ayrılmış bir bölümün içine girer. Bir kayıt ifadesinde, adlar her bir alan değerinden önce gelir ve sonrasında iki nokta üst üste işareti bulunur:

// Bir değişken bildiriminde tür ek açıklamasını kaydedin:
({int a, bool b}) record;

// Bir kayıt ifadesiyle başlatın:
record = (a: 123, b: true);

Bir kayıt tipindeki adlandırılmış alanların adları, kaydın tip tanımının veya şeklinin bir parçasıdır. Farklı adlara sahip adlandırılmış alanları olan iki kayıt farklı türlere sahiptir:

({int a, int b}) recordAB = (a: 1, b: 2);
({int x, int y}) recordXY = (x: 3, y: 4);

// Derleme hatası! Bu kayıtlar aynı türe sahip değil.
// recordAB = recordXY;

Bir kayıt türü açıklamasında, konumsal alanları da adlandırabilirsiniz, ancak bu adlar yalnızca dokümantasyon içindir ve kaydın türünü etkilemez:

(int a, int b) recordAB = (1, 2);
(int x, int y) recordXY = (3, 4);

recordAB = recordXY; // OK.

Bu, bir işlev bildirimindeki veya işlev tip tanımındaki konumsal parametrelerin isimlere sahip olabilmesine benzer, ancak bu isimler işlevin imzasını etkilemez.

Record fields

Kayıt alanlarına yerleşik getter’lar aracılığıyla erişilebilir. Kayıtlar değişmezdir, bu nedenle alanların ayarlayıcıları yoktur.

Adlandırılmış alanlar aynı addaki alıcıları ortaya çıkarır. Konumsal alanlar, adlandırılmış alanları atlayarak $<konum> adındaki alıcıları ortaya çıkarır:

var record = ('first', a: 2, b: true, 'last');

print(record.$1); // Prints 'first'
print(record.a); // Prints 2
print(record.b); // Prints true
print(record.$2); // Prints 'last'

Record types

Bireysel kayıt türleri için tür bildirimi yoktur. Kayıtlar, alanlarının türlerine göre yapısal olarak tiplendirilir. Bir kaydın şekli (alanlarının kümesi, alanların türleri ve varsa adları) bir kaydın türünü benzersiz bir şekilde belirler.

Bir kayıttaki her alanın kendi tipi vardır. Alan tipleri aynı kayıt içinde farklılık gösterebilir. Tip sistemi, kayıttan erişildiği her yerde her alanın tipinden haberdardır:

(num, Object) pair = (42, 'a');

var first = pair.$1; // Static type `num`, runtime type `int`.
var second = pair.$2; // Static type `Object`, runtime type `String`.

Aynı alan kümesine sahip kayıtlar oluşturan iki ilgisiz kütüphane düşünün. Tip sistemi, kütüphaneler birbirine bağlı olmasa bile bu kayıtların aynı tipte olduğunu anlar.

Record equality

İki kayıt aynı şekle (alan kümesi) sahipse ve karşılık gelen alanları aynı değerlere sahipse eşittir. Adlandırılmış alan sırası kaydın şeklinin bir parçası olmadığından, adlandırılmış alanların sırası eşitliği etkilemez.

Örneğin:

(int x, int y, int z) point = (1, 2, 3);
(int r, int g, int b) color = (1, 2, 3);

print(point == color); // Prints 'true'.
({int x, int y, int z}) point = (x: 1, y: 2, z: 3);
({int r, int g, int b}) color = (r: 1, g: 2, b: 3);

print(point == color); // Prints 'false'. Lint: Equals on unrelated types.

Kayıtlar, alanlarının yapısına göre hashCode ve == yöntemlerini otomatik olarak tanımlar.

Multiple returns

Kayıtlar, fonksiyonların birden fazla değeri bir arada döndürmesine olanak tanır. Bir dönüşten kayıt değerlerini almak için, kalıp eşleştirmeyi kullanarak değerleri yerel değişkenler halinde yeniden yapılandırın.

// Returns multiple values in a record:
(String, int) userInfo(Map<String, dynamic> json) {
return (json['name'] as String, json['age'] as int);
}

final json = <String, dynamic>{
'name': 'Dash',
'age': 10,
'color': 'blue',
};

// Bir kayıt kalıbı kullanarak yok eder:
var (name, age) = userInfo(json);

/* Equivalent to:
var info = userInfo(json);
var name = info.$1;
var age = info.$2;
*/

Bir fonksiyondan kayıt olmadan birden fazla değer döndürebilirsiniz, ancak diğer yöntemlerin dezavantajları vardır. Örneğin, bir sınıf oluşturmak çok daha ayrıntılıdır ve List veya Map gibi diğer koleksiyon türlerini kullanmak tür güvenliğini kaybeder.

--

--