Menu
Coddy logo textTech

Traitleri Uygulama

Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 30 / 61.

Artık bir trait'in nasıl tanımlanacağını bildiğinize göre, bir struct'ın bu sözleşmeyi nasıl yerine getireceğini görelim. Bir trait'i uygulamak, soyut gereksinimi somut davranışa bağlar.

Söz dizimi impl TraitName for StructName yapısını kullanır:

trait Speak {
    fn speak(&self) -> String;
}

struct Dog {
    name: String,
}

impl Speak for Dog {
    fn speak(&self) -> String {
        format!("{} says: Woof!", self.name)
    }
}

impl Speak for Dog bloğu, Rust'a Dog türünün Speak trait'ini uyguladığını söyler. İçerisinde, gerçek metot gövdesini sağlarsınız; burası bir köpeğin nasıl konuştuğunu tanımladığınız yerdir.

Birden fazla tür aynı trait'i uyguladığında trait'lerin gücü netleşir:

struct Cat {
    name: String,
}

impl Speak for Cat {
    fn speak(&self) -> String {
        format!("{} says: Meow!", self.name)
    }
}

Hem Dog hem de Cat artık Speak yeteneğini paylaşıyor, ancak her biri kendi benzersiz uygulamasını sunar. Her iki tür üzerinde de .speak() metodunu çağırabilirsiniz:

let dog = Dog { name: String::from("Rex") };
let cat = Cat { name: String::from("Whiskers") };

println!("{}", dog.speak());  // Rex şöyle der: Woof!
println!("{}", cat.speak());  // Whiskers şöyle der: Meow!

Bu, Rust'taki polimorfizmin temelidir—farklı türler, aynı arayüz, benzersiz davranışlar.

challenge icon

Görev

Kolay

Trait'leri farklı türler için uygulayarak hayata geçirelim! Bir Describable trait'i oluşturacak ve bunu, her biri kendi benzersiz açıklamasını sunan iki farklı struct için uygulayacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • describable.rs: describe(&self) -> String metoduna sahip genel (public) bir Describable trait'i tanımlayın.
  • items.rs: Trait'inizi uygulayan iki genel struct oluşturun:
    • Genel bir title alanına (String) sahip Book
    • Genel bir name alanına (String) sahip Movie
    Her struct, Describable trait'ini kendi benzersiz açıklama formatıyla uygulamalıdır.
  • main.rs: Modüllerinizi bir araya getirin, her iki struct'tan da örnekler oluşturun ve aynı trait'in farklı türler için nasıl farklı çıktılar ürettiğini göstermek için describe metodlarını çağırın.

Book struct'ınız kendisini Book: {title} olarak, Movie struct'ınız ise kendisini Film: {name} olarak tanımlamalıdır. Her türün aynı sözleşmeyi (contract) nasıl kendi davranışıyla yerine getirdiğine dikkat edin!

Ana dosyanızda, sağlanan iki girişi kullanarak bir kitap ve bir film oluşturun, ardından açıklamalarını ayrı satırlara yazdırın.

Çıktınız şu formatta olmalıdır:

Book: {title}
Film: {name}

Örneğin, 1984 ve Inception girişleri için:

Book: 1984
Film: Inception

İki giriş alacaksınız: bir kitap başlığı ve bir film adı.

Kopya kağıdı

Bir struct için bir trait uygulamak için impl TraitName for StructName sözdizimini kullanın:

trait Speak {
    fn speak(&self) -> String;
}

struct Dog {
    name: String,
}

impl Speak for Dog {
    fn speak(&self) -> String {
        format!("{} says: Woof!", self.name)
    }
}

Birden fazla tür, aynı trait'i farklı davranışlarla uygulayabilir:

struct Cat {
    name: String,
}

impl Speak for Cat {
    fn speak(&self) -> String {
        format!("{} says: Meow!", self.name)
    }
}

let dog = Dog { name: String::from("Rex") };
let cat = Cat { name: String::from("Whiskers") };

println!("{}", dog.speak());  // Rex says: Woof!
println!("{}", cat.speak());  // Whiskers says: Meow!

Bu, Rust'ta polimorfizmi mümkün kılar; farklı türler aynı arayüzü benzersiz uygulamalarla paylaşır.

Kendin dene

mod describable;
mod items;

use describable::Describable;
use items::{Book, Movie};

fn main() {
    // Girdileri oku
    let mut title = String::new();
    std::io::stdin().read_line(&mut title).expect("Failed to read line");
    let title = title.trim().to_string();
    
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    // TODO: Başlık ile bir Book örneği oluşturun
    
    // TODO: İsim ile bir Movie örneği oluşturun
    
    // TODO: Kitabın açıklamasını yazdırın
    
    // TODO: Filmin açıklamasını yazdırın
}
quiz iconKendini test et

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