Bir Shape Tanımlamak
Bir shape, isimlendirilmiş ve tipli alanlara sahip bir record tipidir:
shape Point {
x: i32,
y: i32,
}
Parçalar:
shapebildirimi başlatır.Pointtipin adıdır.- Brace'ler her biri
name: Typeolan alanların listesini içerir.
Bu bildirim mevcut scope'a Point adında yeni bir tip ekler. i32 gibi yerleşik bir tip kullanabileceğiniz her yerde artık Point'i de kullanabilirsiniz.
Bir Shape Değeri Oluşturmak
Bir instance'ı struct-literal ifadesiyle oluşturun:
let point = Point { x: 40, y: 2 }
Literal shape'i adlandırır ve her alanı atar. Her alanın mevcut olması gerekir — Zero eksik alanlara sessizce sıfır veya null vermez. Birini unutursanız compiler size söyler:
{
"code": "FLD002",
"message": "missing field: y",
"line": 4
}
(Kesin error code değişebilir; "implicit default yok" prensibi sabittir.)
Tipi explicit olarak görünür yapmak istiyorsanız onu yazabilirsiniz:
let point: Point = Point { x: 40, y: 2 }
Alanları Okumak
Alan erişimi nokta söz dizimi kullanır:
let point = Point { x: 40, y: 2 }
let xVal = point.x
let yVal = point.y
point.x, x alanını okur. Bir get_x() metodu yok — alanlar düz veridir.
Tam İşlenmiş Bir Örnek
Bu, dilin repository'sindeki kanonik point.0 örneği — denemek için Run'a tıklayın:
Yukarıdan aşağı okuyun:
- İki
i32alana sahip birPointshape'i tanımlayın. - Bir
Pointalıp alanlarının toplamını döndüren birsumfonksiyonu tanımlayın. main'de birPointoluşturun,sum'ı çağırın ve sonucu karşılaştırın.
Üç adım, üç shape ile ilgili fikir (tanımla, oluştur, eriş) ve sondaki check world.out.write(...) ile bir effect. sum'ın World'e dokunmadığına dikkat edin. Veriye karşı pure bir fonksiyondur ve imza bunu apaçık yapar.
İç İçe Alanlara Sahip Shape'ler
Bir shape, diğer shape'ler de dahil herhangi bir tipteki değerleri tutabilir:
shape Range {
start: i32,
end: i32,
}
shape Segment {
label: String,
range: Range,
}
let seg = Segment {
label: "warmup",
range: Range { start: 0, end: 10 },
}
Alan erişimi beklediğiniz gibi zincirlenir:
let len = seg.range.end - seg.range.start
Generic Shape'ler
Bir shape'in alanlarının tip-polimorfik olması gerektiğinde, angle bracket'ler içinde type parametreleri bildirin:
shape Pair<T, U> {
left: T,
right: U,
}
Instance'lar parametreleri somut tiplere sabitler:
let intBytePair: Pair<i32, u8> = Pair { left: 40, right: 2_u8 }
let words: Pair<String, String> = Pair { left: "hello", right: "world" }
Bir type alias yaygın bir parametrelendirmeyi kısaltabilir:
type BytePair = Pair<u8, u8>
let bytes: BytePair = Pair { left: 1_u8, right: 2_u8 }
Generics sadece shape'lerde değil fonksiyonlarda da type parametrelerini daha derinden ele alıyor.
Shape'lerin Olmadığı Şeyler
Başka bir dildeki "struct"tan bekleyebileceğiniz ama shape'lerin bilinçli olarak içermediği birkaç şey:
- Metot yok. Bir shape bildirimi yalnızca veridir. Davranış, shape'i parametre olarak alan serbest fonksiyonlarda yaşar. Bu, fonksiyonlarda gördüğünüz veri ve effect ayrımının aynısını yansıtır.
- Inheritance yok. Shape'ler diğer shape'leri genişletmez. Paylaşılan yapı istiyorsanız onu ortak bir alana çıkarın ya da choice ile bir sum type kurun.
- Implicit constructor veya destructor yok. Oluşturma, struct-literal ifadesidir. Temizlik explicit'tir — standart kütüphane dispose edilmesi gereken kaynaklar sunduğunda bu, gizli RAII yerine capability tarzı API'ler üzerinden yapılır.
- Private alan yok. Bir shape'in alanları, shape'in tipini görebilen tüm koda erişilebilir. Görünürlük alan seviyesinde değil tip seviyesindedir.
Desen şudur: shape'ler basit, öngörülebilir record tipleridir ve geri kalan her şeyi bunlardan inşa edersiniz.
Shape mi, Choice mi?
Hızlı rehber:
- Bir değerin tüm bu alanlara birlikte sahip olduğu durumlarda shape kullanın. Bir
Point'in her zaman hemx'i hem dey'si vardır. - Bir değerin birkaç alternatiften biri olduğu durumlarda choice kullanın. Bir
Resultya birok'tur ya birerr. - Alternatifler ekstra veri taşımıyorsa — sadece etiket iseler — enum kullanın. Haftanın günleri, basit state'ler.
Bu üç yapı taşı — shape (ve), choice (veya), enum (payload'sız veya) — neredeyse her veri modelleme ihtiyacını karşılar.
Sırada: Generics
Geçerken Pair<T, U>'nun göründüğünü gördünüz. Bir sonraki yazı, generics, type parametrelerinin hem shape'lerde hem de fonksiyonlarda nasıl çalıştığını ve Zero standart kütüphanesinde tekrar eden desenleri açıklıyor.
Sıkça Sorulan Sorular
Zero'da shape nedir?
Bir shape, Zero'nun struct benzeri product type'ıdır — tipli alanlara sahip isimlendirilmiş bir record. shape Name { field1: T1, field2: T2 } ile tanımlarsınız, Name { field1: v1, field2: v2 } ile değerler oluşturursunuz ve nokta söz dizimi ile alanları okursunuz (value.field1). Shape'ler yapılandırılmış veri modellemenin yapı taşıdır.
Bir shape değeri nasıl oluşturulur?
Shape'i adlandıran ve her alanı atayan bir struct-literal ifadesi kullanın: let point = Point { x: 40, y: 2 }. Her alanın doldurulması gerekir — Zero, eksik alanlara sessizce varsayılan vermez. Literal'deki alanların sırası, tanımdaki sırayla eşleşmek zorunda değil.
Shape, class'tan nasıl farklıdır?
Bir shape düz veridir — alanları vardır ama metotları, inheritance'ı, implicit constructor'ı yoktur. Bir shape üzerinde işleyen fonksiyonlar onu explicit olarak parametre olarak alır. Bu ayrım dili küçük tutar ve bir shape'i kurmanın veya kopyalamanın maliyetini öngörülebilir kılar; gizli vtable veya destructor yok.
Zero'da shape'ler generic olabilir mi?
Evet. Angle bracket'ler içinde type parametreleri bildirin: shape Pair<T, U> { left: T, right: U }. Instance'lar bu parametreleri sabitler: Pair<i32, u8>. Generic shape'ler standart kütüphane boyunca görünür — Maybe<T>, Span<T> vb. hepsi aynı fikir üzerine inşa edilmiş generic shape'ler veya sum type'lardır.
Shape'ler fonksiyonlara geçirildiğinde kopyalanır mı yoksa referans olarak mı?
Pass-by-value, shape'ler için varsayılan zihinsel modeldir — çağrılan fonksiyon, çağıranın bağlamasına bir referans değil verinin kendi mantıksal kopyasını görür. Pre-1.0 Zero'daki kesin memory modeli hâlâ gelişiyor (standart kütüphane örneklerinde explicit referans tipleri için ref ve mutref göreceksiniz). Uygulama kodunun çoğu için shape parametrelerini değer tipinde input'lar olarak ele alın.