Menu
Coddy logo textTech

Ç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.

challenge icon

Görev

Kolay

Birden 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: Inspectable alan ve denetim ayrıntılarını içeren bir inspect döndüren &self adlı bir metoda sahip, herkese açık bir String trait'i tanımla. Ardından herkese açık Gadget (String) ve name (u32) alanlarına sahip, herkese açık bir serial struct'ı oluştur. Gadget hem Inspectable trait'ini (Inspecting: {name} döndürecek şekilde) hem de std::fmt::Display trait'ini ({name} (SN: {serial}) biçiminde biçimlendirecek şekilde) uygulamalıdır. Son olarak hem full_report hem de T uygulayan herhangi bir Display türünü kabul eden, Inspectable adlı 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ından inspect() çağrısının sonucunu.
  • main.rs: product modülünü dahil et ve sağlanan girdileri kullanarak bir Gadget örneği oluştur. Her iki trait gereksinimini de karşıladığını göstermek için gadget'ın full_report iş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
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Rust derleyicisi