Trait nedir?
- Rust kursu
- Orta seviye
- Ders 1/115
- 4 dk
Trait ile ortak davranış tanımlamayı öğrenirsin.
Trait nedir?
Trait, türlerin paylaşabileceği bir davranış sözleşmesidir: "bu türü uygulayan her tür şu metotlara sahiptir". Diğer dillerdeki arayüzlere (interface) benzer:
trait Ses {
fn ses(&self) -> String;
}
struct Kedi;
impl Ses for Kedi {
fn ses(&self) -> String {
String::from("Miyav")
}
}Trait yalnızca imzayı tanımlar; gövdeyi her tür kendi impl Trait for Tür bloğunda yazar.
Trait metodunu çağırmak
Trait metotları normal metotlar gibi nokta ile çağrılır, ama trait'in kapsamda olması gerekir. Aynı modülde tanımlıysa zaten kapsamdadır; başka bir crate'ten geliyorsa use ile alınır:
use std::fmt::Write; // write! makrosunu String'e uygulamak için
let mut s = String::new();
write!(s, "{}-{}", 1, 2).unwrap();
println!("{s}"); // 1-2Trait kapsamda değilse derleyici "method not found ... items from traits can only be used if the trait is in scope" der ve hangi use satırının eksik olduğunu önerir.
Uygulama İlk trait
fn ses(&self) -> String metodunu içeren trait Ses tanımla. struct Kedi; için uygula ("Miyav") ve Kedi.ses() sonucunu yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
trait Ses {
fn ses(&self) -> String;
}
struct Kedi;
impl Ses for Kedi {
fn ses(&self) -> String {
String::from("Miyav")
}
}
fn main() {
println!("{}", Kedi.ses());
}Beklenen çıktı
Miyav
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir trait metodunun gövdesini yazmayı unutursan ne olur?
- Metot boş çalışır
- Çalışma anında panic
- Uyarı verir
- Derleme hatası: eksik trait öğesi (E0046) Doğru cevap
Açıklama: Varsayılan gövdesi olmayan her metot uygulamada yazılmalıdır.
2 Trait uygula
impl Ses ____ Kedi {
fn ses(&self) -> String {
String::from("Miyav")
}
}
impl Ses for Kedi {
fn ses(&self) -> String {
String::from("Miyav")
}
}
Açıklama: Trait uygulaması impl Trait for Tür biçimindedir.
3 Yazım ve anlamı
| Kavram | Anlamı |
|---|---|
trait Ses { .. } |
Sözleşme tanımı |
impl Ses for Kedi |
Uygulama |
fn ses(&self) -> String; |
Gövdesiz imza |
use std::fmt::Write |
Trait'i kapsama alır |