Tür Durumlu Oluşturucular
Geçerliliği tür sisteminde kodlayın.
Tür Durumlu Oluşturucular, CoddyKit'te ücretsiz bir Learn Rust Coding dersidir. Bu, 4 dersinin 3. 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, Learn Rust Coding öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Learn Rust Coding kursu toplamda 4 dersten oluşur.
Basit Oluşturucuların Sorunu
Normal bir oluşturucu, gerekli alanlar ayarlanmadan önce bile istediğiniz zaman build() çağırmanıza izin verir. Eksik veriler daha sonra çalışma zamanında bir paniğe veya bir Err'e dönüşür.
Tür durumlu oluşturucular bu denetimi derleme zamanına taşır: gerekli bir adımı unutmanız, kodun derlenmemesine neden olur.
Durumu Türlerde Kodlama
Yöntem, oluşturucuyu tamamlanan adımları temsil eden işaretçi türlerine göre genel hâle getirmektir. Her alanı ayarladığınızda oluşturucunun türü değişir.
Ancak her gerekli işaretçi "set" durumuna ulaştığında bir build() yöntemi kullanılabilir olur.
struct Missing;
struct Set;İşaretçilere Göre Genel Bir Oluşturucu
Oluşturucu türüne, her gerekli alanın durumu için tür parametreleri verin. PhantomData, gerçek veri depolamadan işaretçiyi taşır.
use std::marker::PhantomData;
struct ReqBuilder<H, U> {
url: Option<String>,
method: Option<String>,
_state: PhantomData<(H, U)>,
}Başlangıç Durumu
Oluşturucu, her gerekli işaretçinin Missing olduğu bir oluşturucu döndürür. Bu noktada hiçbir build() mevcut değildir; bu nedenle tür sistemi nesnenin tamamlanmamış olduğunu bilir.
impl ReqBuilder<Missing, Missing> {
fn new() -> Self {
ReqBuilder { url: None, method: None, _state: PhantomData }
}
}İşaretçiyi Geçiş Yaptırma
Bir ayarlayıcı eski oluşturucuyu tüketir ve o alanın işaretçisinin Set durumuna geçirildiği yeni bir oluşturucu döndürür. Diğer işaretçi, tür parametresi genel bırakılarak korunur.
impl<U> ReqBuilder<Missing, U> {
fn url(self, url: &str) -> ReqBuilder<Set, U> {
ReqBuilder { url: Some(url.to_string()),
method: self.method, _state: PhantomData }
}
}İkinci Geçiş
Yöntemi ayarlamak da aynı şekilde çalışır: ikinci işaretçiyi Missing'den Set'e geçirirken birinci işaretçiyi değiştirmez.
impl<H> ReqBuilder<H, Missing> {
fn method(self, m: &str) -> ReqBuilder<H, Set> {
ReqBuilder { url: self.url,
method: Some(m.to_string()), _state: PhantomData }
}
}Yalnızca Tamamen Ayarlandığında build()
Önemli nokta şudur: build() yalnızca ReqBuilder<Set, Set> için uygulanır. Diğer durumların hiçbirinde böyle bir yöntem bulunmaz; dolayısıyla çağrı derlenmez.
İçerideki unwrap çağrıları hiçbir zaman paniğe neden olamaz; çünkü tür, her iki alanın da mevcut olduğunu kanıtlar.
struct Request { url: String, method: String }
impl ReqBuilder<Set, Set> {
fn build(self) -> Request {
Request { url: self.url.unwrap(), method: self.method.unwrap() }
}
}Hepsini Bir Araya Getirme
Doğru zincir sorunsuz biçimde derlenir; çünkü her çağrı oluşturucuyu build()'in bulunduğu ReqBuilder<Set, Set> durumuna yaklaştırır.
fn demo() -> Request {
ReqBuilder::new()
.url("https://example.com")
.method("GET")
.build()
}İstediğiniz Derleme Hatası
Gerekli bir adımı atlarsanız derleyici bunu reddeder. ReqBuilder<Set, Missing> üzerinde build() çağırmak, "no method named build" bildirimini verir ve eksikliği program çalışmadan önce yakalar.
// ReqBuilder::new().url("x").build();
// error: no method named `build` found for
// ReqBuilder<Set, Missing>Kendi İçinde Tam ve Çalıştırılabilir Sürüm
Bu en küçük program, tüm geçişi baştan sona göstermek için tek bir gerekli alan kullanır. Derlenir ve oluşturulan değeri yazdırır.
use std::marker::PhantomData;
struct Missing; struct Set;
struct B<N> { name: Option<String>, _s: PhantomData<N> }
impl B<Missing> {
fn new() -> Self { B { name: None, _s: PhantomData } }
fn name(self, n: &str) -> B<Set> {
B { name: Some(n.to_string()), _s: PhantomData }
}
}
impl B<Set> {
fn build(self) -> String { self.name.unwrap() }
}
fn main() {
let v = B::new().name("prod").build();
println!("built: {}", v);
}Maliyetler ve Ödünleşimler
Tür durumlu oluşturucular, işaretçiler silindiği için çalışma zamanında ek maliyet olmadan derleme zamanı güvenceleri sağlar. Bunun bedeli, daha fazla tür mekanizması ve gerekli alanlar arttıkça çoğalan uygulama bloklarıdır.
Bu kalıbı, tamamlanmamış bir oluşturmanın yapı gereği imkânsız olması gereken API'ler için ayırın.
Hızlı Kontrol
Tür durumlu bir oluşturucuda tamamlanmayı gerçekte neyin zorunlu kıldığını belirleyin.
Özet
Tür durumlu oluşturucular, her gerekli adımı PhantomData ile taşınan bir işaretçi türü parametresi olarak kodlar. Ayarlayıcılar oluşturucuyu tüketir ve işaretçilerden birinin Set durumuna geçirildiği yeni bir tür döndürür.
build() yalnızca tüm işaretçilerin Set olduğu durum için uygulandığından, bir adımı unutmak çalışma zamanı paniği değil, derleme hatasıdır; üstelik çalışma zamanında hiçbir maliyeti yoktur.
Sıkça Sorulan Sorular
“Tür Durumlu Oluşturucular” dersi ücretsiz mi?
Evet — “Tür Durumlu Oluşturucular” 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 Learn Rust Coding kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Learn Rust Coding kursu toplamda 4 dersten oluşur.
“Tür Durumlu Oluşturucular” dersinde ne öğreneceğim?
Geçerliliği tür sisteminde kodlayın. Learn Rust Coding 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.
Learn Rust Coding öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Learn Rust Coding, 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 3. dersidir.
“Tür Durumlu Oluşturucular” 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 Learn Rust Coding dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Learn Rust Coding 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
- Oluşturucu Kalıbı
- Newtype Kalıbı
- Tür Durumlu Oluşturucular
- Deref ve Sarmalayıcı Kullanışlılığı