Çoklu Sınırlandırıcılar
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 41 / 61.
Bazen tek bir özellik sınırı yeterli olmaz. Hem yazdırılabilen hem de bir özet sunabilen genel bir türe ihtiyaç duyabilirsiniz. Rust, + söz dizimini kullanarak birden fazla özellik gerektirebilmenizi sağlar.
Bir türün iki trait'i uygulaması gerektiğini şu şekilde belirtebilirsin:
use std::fmt::Display;
trait Summary {
fn summarize(&self) -> String;
}
fn announce<T: Display + Summary>(item: T) {
println!("Breaking news: {}", item);
println!("Summary: {}", item.summarize());
}
T: Display + Summary sınırı, "T hem Display hem de Summary uygulamalıdır." anlamına gelir. Fonksiyonun içinde her iki trait'in yeteneklerini kullanabilirsiniz: {} ile yazdırma (Display'den) ve summarize() çağırma (Summary'den).
Gerektiği kadar çok trait'i birbirine zincirleyebilirsiniz:
fn process<T: Display + Summary + Clone>(item: T) {
// Yazdırabilir, özetleyebilir VE klonlayabilir
}
Bu desen, işleviniz birden fazla davranışa bağlı olduğunda gereklidir. Herhangi bir türü kabul edip çalışacağını ummak yerine, tam olarak hangi yeteneklerin gerekli olduğunu açıkça bildirirsiniz ve derleyici bunu derleme zamanında zorunlu kılar.
Görev
KolayBirden fazla yeteneğe sahip olması gereken öğeler için bir ürün denetim sistemi oluşturalım! Hem özel bir trait'i hem de standart bir trait'i uygulayan türleri kabul eden genel bir işlev oluşturacak ve + söz diziminin birden fazla sınırı nasıl birleştirdiğini göstereceksin.
Kodunu iki dosyaya ayıracaksın:
product.rs:Inspectablealan ve denetim ayrıntılarını içeren birinspectdöndüren&selfadlı bir metoda sahip, herkese açık birStringtrait'i tanımla. Ardından herkese açıkGadget(String) vename(u32) alanlarına sahip, herkese açık birserialstruct'ı oluştur. Gadget hemInspectabletrait'ini (Inspecting: {name}döndürecek şekilde) hem destd::fmt::Displaytrait'ini ({name} (SN: {serial})biçiminde biçimlendirecek şekilde) uygulamalıdır. Son olarak hemfull_reporthem deTuygulayan herhangi birDisplaytürünü kabul eden,Inspectableadlı herkese açık bir genel işlev oluştur. Bu işlev iki satır yazdırmalıdır: önce{}biçimlendiricisini kullanarak öğeyi, ardındaninspect()çağrısının sonucunu.main.rs: product modülünü dahil et ve sağlanan girdileri kullanarak birGadgetörneği oluştur. Her iki trait gereksinimini de karşıladığını göstermek için gadget'ınfull_reportişlevine aktar.
Birden fazla sınırın gücü, full_report işlevinin her iki trait'in yeteneklerini kullanabilmesidir: öğeyi düzgün bir şekilde görüntüler VE denetim ayrıntılarını alır; üstelik bunların tümü derleme zamanında garanti edilir.
Çıktın hem görüntüleme biçimini hem de denetim sonucunu göstermelidir:
{name} (SN: {serial})
Inspecting: {name}Örneğin, Smartwatch ve 98765 girdileriyle:
Smartwatch (SN: 98765)
Inspecting: Smartwatchİki girdi alacaksın: gadget adı ve seri numarası (u32 olarak ayrıştır).
Kendin dene
mod product;
use product::{Gadget, full_report};
fn main() {
// Girdileri oku
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut serial_input = String::new();
std::io::stdin().read_line(&mut serial_input).expect("Failed to read line");
let serial: u32 = serial_input.trim().parse().expect("Failed to parse serial");
// TODO: name ve serial ile bir Gadget örneği oluştur
// TODO: full_report'u gadget'ınla ç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