Where Cümleciği
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 42 / 61.
Daha fazla trait sınırı ekledikçe, işlev imzalarını okumak zorlaşabilir. Her biri birkaç trait gerektiren birden çok genel parametreye sahip bir işlevi düşünün:
fn complex_operation<T: Display + Clone, U: Debug + Summary>(first: T, second: U) {
// ...
}
Bu çalışır, ancak imza giderek karmaşıklaşıyor. where yan tümcesi, özellik sınırlarını parametre listesinden sonra taşıyarak daha temiz bir alternatif sunar:
fn complex_operation<T, U>(first: T, second: U)
where
T: Display + Clone,
U: Debug + Summary,
{
// ...
}
Her iki sürüm de işlevsel olarak aynıdır: where yan tümcesi yalnızca okunabilirlikle ilgilidir. Her türün gereksinimleri kendi satırında yer alır; böylece her genel tür parametresinin neye ihtiyaç duyduğunu tarayarak görmek kolaylaşır.
where yan tümcesi, sınırlar karmaşık olduğunda veya çok sayıda genel parametreye sahip olduğunuzda özellikle değerli hâle gelir. İşlev adını ve parametreleri bir bakışta görünür tutar; kısıtlamalar ise aşağıda ayrı olarak listelenir. Sınırlar basit bir T: Trait ifadesinin ötesine geçtiğinde, çoğu Rust kod tabanında tercih edilen stil budur.
Görev
KolayKarmaşık trait sınırlarını okunabilir tutmak için where yan tümcesini kullanan bir veri işleme sistemi oluşturalım! Birden çok tür parametresine sahip genel bir işlev oluşturacak, her biri farklı trait'ler gerektirecek ve sınırları where söz dizimini kullanarak düzenli bir şekilde organize edeceksin.
Kodunu iki dosyaya ayıracaksın:
processor.rs: İki public trait ve her ikisini de kullanan genel bir işlev tanımla:Summarize:summaryalan ve&selfdöndüren birStringmetoduna sahip bir traitValidate:validatealan ve&selfdöndüren birboolmetoduna sahip bir trait
process_itemsadlı bir public genel işlev oluştur. Birinci türün hemwherehem deCloneuygulaması, ikinci türün iseSummarizeuygulaması gerektiğini belirtmek için birValidateyan tümcesi kullan. İşlev, önce birinci öğenin özetini, ardından ikinci öğenin geçerli olup olmadığını yazdırmalıdır.main.rs: Gerekli trait'leri uygulayan iki public struct oluştur:Article: public birtitlealanına (String) sahip olsun.Summarizedöndürecek şekildeArticle: {title}uygulansın veClonetüretilebilsin.Form: public birfilledalanına (bool) sahip olsun.Validateuygulanarakfilleddeğerini döndürsün.
process_itemsişlevini çağır.
where yan tümcesi, tüm sınırları köşeli parantezlerin içine sıkıştırmaya kıyasla işlev imzasını çok daha temiz hâle getirir. Her türün gereksinimleri kendi satırında yer alır; böylece her genel parametrenin neye ihtiyaç duyduğunu görmek kolaylaşır.
Çıktın, özeti ve ardından doğrulama sonucunu göstermelidir:
Article: {title}
Valid: {true/false}Örneğin, Rust Tips ve true girdileriyle:
Article: Rust Tips
Valid: trueBreaking News ve false girdileriyle:
Article: Breaking News
Valid: falseİki girdi alacaksın: makale başlığı ve formun doldurulup doldurulmadığı ( bool olarak ayrıştır).
Kendin dene
mod processor;
use processor::{Summarize, Validate, process_items};
use std::io;
// TODO: public title alanı (String) olan public bir Article struct'ı tanımla
// Article için Clone derive et
// TODO: Article için Summarize'ı implement et
// summary metodu "Article: {title}" döndürmeli
// TODO: public filled alanı (bool) olan public bir Form struct'ı tanımla
// TODO: Form için Validate'i implement et
// validate metodu filled değerini döndürmeli
fn main() {
let mut title = String::new();
io::stdin().read_line(&mut title).expect("Failed to read line");
let title = title.trim().to_string();
let mut filled_input = String::new();
io::stdin().read_line(&mut filled_input).expect("Failed to read line");
let filled: bool = filled_input.trim().parse().expect("Failed to parse bool");
// TODO: verilen title ile bir Article oluştur
// TODO: verilen filled değeri ile bir Form oluştur
// TODO: process_items'ı article ve form ile çağır
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media PlayerKendi başına pratik yap: Online Rust derleyicisi