Nitelik

Nitelik yani trait bilinmeyen bir tip için tanımlanan metotlar koleksiyonudur: Self (Kendi). Aynı nitelikte bildirilen diğer metotlara erişebilirler.

Nitelikler herhangi bir veri tipi için uygulanabilirler. Aşağıdaki örnekte, bir metot grubu olan Animalı tanımlıyoruz. Animal trait(nitelik)i daha sonra Sheep veri tipi için uygulanarak Animal ve Sheepten metotların kullanılmasına izin verir.

struct Sheep { naked: bool, name: &'static str }

trait Animal {
    // Static metot imzası; `Self` implemente edici ifade eder.
    fn new(name: &'static str) -> Self;

    // Örnek metot imzaları; bunlar bir string döndürecektir.
    fn name(&self) -> &'static str;
    fn noise(&self) -> &'static str;

    // Nitelikler, varsayılan metot tanımlamaları sağlayabilir.
    fn talk(&self) {
        println!("{} says {}", self.name(), self.noise());
    }
}

impl Sheep {
    fn is_naked(&self) -> bool {
        self.naked
    }

    fn shear(&mut self) {
        if self.is_naked() {
            // İmplemente edici metotları, implemente edicinin nitelik metotlarını kullanabilir
            println!("{} is already naked...", self.name());
        } else {
            println!("{} gets a haircut!", self.name);

            self.naked = true;
        }
    }
}

// `Animal` niteliğini `Sheep` için implemente edin.
impl Animal for Sheep {
    // `Self`, implemente edici tipi: `Sheep`.
    fn new(name: &'static str) -> Sheep {
        Sheep { name: name, naked: false }
    }

    fn name(&self) -> &'static str {
        self.name
    }

    fn noise(&self) -> &'static str {
        if self.is_naked() {
            "baaaaah?"
        } else {
            "baaaaah!"
        }
    }
    
    // Varsayılan nitelik metotları geçersiz kılınabilir.
    fn talk(&self) {
        // Örneğin, biraz sessiz düşünme durağı ekleyebiliriz.
        println!("{} pauses briefly... {}", self.name, self.noise());
    }
}

fn main() {
    // Bu durumda, tip açıklaması gereklidir.
    let mut dolly: Sheep = Animal::new("Dolly");
    // YAPILACAK ^ Tip ek açıklamalarını kaldırmayı deneyin.

    dolly.talk();
    dolly.shear();
    dolly.talk();
}