Trait Sınırlandırıcı Sözdizimi
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 40 / 61.
Şimdiye kadar trait'leri tanımlamayı ve bunları struct'lar için uygulamayı öğrendin. Ayrıca esnek kod yazmak için generic'lerle de çalıştın. Şimdi bu kavramları birleştirmenin zamanı: bir generic fonksiyonun hangi türleri kabul edebileceğini sınırlamak için trait'leri kullanmak.
Parametresi üzerinde belirli bir yöntemi çağırması gereken genel bir işlev düşünün. Herhangi bir kısıtlama olmadığında Rust, T türünün bu yönteme sahip olduğuna dair hiçbir güvence vermez:
fn print_info<T>(item: T) {
println!("{}", item.summarize()); // Hata! T'nin summarize() metodu olmayabilir
}
Çözüm bir trait kısıtlamasıdır. Genel parametrenin sonuna : TraitName ekleyerek Rust'a T'nin bu trait'i uygulaması gerektiğini söylersin:
trait Summary {
fn summarize(&self) -> String;
}
fn print_info<T: Summary>(item: T) {
println!("{}", item.summarize()); // Artık Rust bu metodun var olduğunu biliyor
}
<T: Summary> söz dizimi, "T, Summary'yi uygulayan herhangi bir türdür." şeklinde okunur. Artık işlev yalnızca gerekli davranışa sahip türleri kabul eder. Summary uygulamayan bir türü aktarmaya çalışırsanız derleyici bunu açık bir hatayla reddeder.
Bu desen güçlüdür çünkü belirli işlevlere hâlâ erişebilen genel kod yazmanıza olanak tanır. İşleviniz esnek kalır; herhangi bir türle çalışır, ancak yalnızca ihtiyaç duyduğunuz davranışı sağlayan türlerle.
Görev
KolayYalnızca düzgün biçimlendirilmiş mesajların gönderilebilmesini sağlamak için trait sınırlarını kullanan bir bildirim sistemi oluşturalım! Belirli bir trait'i uygulayan herhangi bir türü kabul eden genel bir işlev oluşturacak ve trait sınırlarının genel parametreleri nasıl kısıtladığını göstereceksin.
Kodunu iki dosyaya ayıracaksın:
notification.rs: BirNotifyadlı yönteme sahip,messagealan ve&selfdöndüren herkese açık birStringtrait'i tanımla. Ardından bu trait'i uygulayan iki herkese açık yapı oluştur:Email: herkese açık birsubjectalanına (String) sahip.messageyöntemiEmail: {subject}döndürmelidirSMS: herkese açık bircontentalanına (String) sahip.messageyöntemiSMS: {content}döndürmelidir
send_notificationtrait'ini uygulayan herhangi birTtürünü kabul eden,Notifyadlı herkese açık bir genel işlev oluştur. Bu işlev, öğe üzerindemessage()çağrısının sonucunu yazdırmalıdır.main.rs: Bildirim modülünü dahil et ve sağlanan girdileri kullanarak hem birEmailhem de birSMSörneği oluştur. Genel işlevininsend_notificationuygulayan herhangi bir türle çalıştığını göstermek için her biriyleNotifyçağrısı yap.
Buradaki temel fikir, send_notification işlevinin aldığı somut türü bilmemesidir. Yalnızca türün bir mesaj üretebildiğini bilir. T: Notify trait sınırı bu yeteneği garanti eder.
Çıktında her iki bildirimin de gönderildiği gösterilmelidir:
Email: {subject}
SMS: {content}Örneğin, Meeting Tomorrow ve On my way! girdileriyle:
Email: Meeting Tomorrow
SMS: On my way!İki girdi alacaksın: e-posta konusu ve SMS içeriği.
Kendin dene
mod notification;
use notification::{Email, SMS, send_notification};
fn main() {
// Girdileri oku
let mut subject = String::new();
std::io::stdin().read_line(&mut subject).expect("Failed to read line");
let subject = subject.trim().to_string();
let mut content = String::new();
std::io::stdin().read_line(&mut content).expect("Failed to read line");
let content = content.trim().to_string();
// TODO: subject ile bir Email örneği oluştur
// TODO: content ile bir SMS örneği oluştur
// TODO: email ile send_notification'ı çağır
// TODO: sms ile send_notification'ı ç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