Display Trait'i
Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 36 / 61.
Debug geliştiricilerin verileri incelemesi için harika olsa da, Display özelliği kullanıcıya yönelik çıktı için tasarlanmıştır. println! içindeki {} biçimlendiricisine güç veren budur. Debug'ın aksine, Rust Display özelliğini otomatik olarak türetemez; onu manuel olarak uygulamanız gerekir.
Display özelliğini uygulamak için, fmt modülünü dahil etmeniz ve fmt metodunu uygulamanız gerekir:
use std::fmt;
struct Temperature {
celsius: f64,
}
impl fmt::Display for Temperature {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}°C", self.celsius)
}
}
fmt metodu bir Formatter alır ve bir fmt::Result döndürür. Çıktınızı biçimlendirmek için self üzerinden yapının alanlarına erişerek write! makrosunu kullanırsınız.
Artık struct'ı standart {} formatlayıcı ile yazdırabilirsiniz:
let temp = Temperature { celsius: 23.5 };
println!("{}", temp); // 23.5°C
Temel fark: Debug çıktısı verilerinizin yapısını gösterir (hata ayıklama için yararlıdır), Display çıktısı ise cilalanmıştır ve son kullanıcılar için tasarlanmıştır. Bir struct her ikisini de uygulayabilir—hata ayıklama için {:?} ve temiz çıktı için {} kullanın.
Görev
KolayKullanıcı dostu bir ürün görüntüleme sistemi oluşturalım! Debug verilerinizin ham yapısını gösterirken, Display trait'i son kullanıcılar için mükemmel, cilalanmış ve insan tarafından okunabilir çıktılar hazırlamanıza olanak tanır.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
product.rs: İki genel (public) alana sahip genel birProductstruct'ı tanımlayın:name(String) veprice(f64). Struct'ınız içinDisplaytrait'ini,{name} - ${price}şeklinde formatlanacak şekilde uygulayın.std::fmtkütüphanesini dahil etmeyi vefmtmetodunuzun içindewrite!makrosunu kullanmayı unutmayın.main.rs: Ürün modülünüzü dahil edin ve sağlanan girdileri kullanarak birProductörneği oluşturun. Özel görüntüleme çıktınızı göstermek için ürünü standart{}formatlayıcısını kullanarak yazdırın.
Display trait'i, fmt metodunu manuel olarak uygulamanızı gerektirir; Rust bunu Debug gibi otomatik olarak türetemez. Bu, türünüzün kullanıcılara nasıl görüneceği üzerinde tam kontrol sahibi olmanızı sağlar.
Çıktınız, ürünü temiz ve kullanıcı dostu bir formatta görüntülemelidir:
{name} - ${price}Örneğin, Wireless Mouse ve 29.99 girdileriyle:
Wireless Mouse - $29.99İki girdi alacaksınız: ürün adı ve fiyat (f64 olarak ayrıştırın).
Kopya kağıdı
Display özelliği, kullanıcıya yönelik çıktı için tasarlanmıştır ve println! içindeki {} biçimlendiricisine güç verir. Debug özelliğinin aksine, manuel olarak uygulanmalıdır.
Display özelliğini uygulamak için fmt modülünü dahil edin ve fmt metodunu uygulayın:
use std::fmt;
struct Temperature {
celsius: f64,
}
impl fmt::Display for Temperature {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}°C", self.celsius)
}
}
fmt metodu bir Formatter alır ve bir fmt::Result döndürür. Çıktıyı biçimlendirmek için write! makrosunu kullanın ve yapı (struct) alanlarına self üzerinden erişin.
Yapıyı {} biçimlendiricisi ile yazdırın:
let temp = Temperature { celsius: 23.5 };
println!("{}", temp); // 23.5°C
Temel fark: Debug ({:?}) hata ayıklama için veri yapısını gösterirken, Display ({}) son kullanıcılar için cilalanmış bir çıktı sağlar.
Kendin dene
mod product;
use product::Product;
fn main() {
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 price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: İsim ve fiyat ile bir Product örneği oluşturun
// TODO: {} biçimlendiriciyi kullanarak ürünü yazdırın
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming 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ı Besleme7Standart Trait'ler
Debug Trait'iDisplay Trait'iClone ve CopyEşitlik Trait'leriÖzet - Yazdırılabilir Nokta2Kapsü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 Player