Trait bound
- Rust kursu
- Orta seviye
- Ders 19/115
- 4 dk
<T: Trait> ile generic parametreye trait sınırı koyarsın.
Trait bound
Trait sınırı (bound), bir generic türün hangi davranışlara sahip olması gerektiğini söyler. T: Display yazınca fonksiyon içinde T değerleri {} ile yazdırılabilir:
use std::fmt::Display;
fn cerceve<T: Display>(x: T) -> String {
format!("[{}]", x)
}
println!("{} {}", cerceve(5), cerceve("a")); // [5] [a]Sınır, hem fonksiyonun gövdesine izin verir hem de çağıranı kısıtlar: Display uygulamayan bir türle çağrı derleme hatasıdır.
Sınır olmadan
Sınır olmadan derleyici T hakkında hiçbir şey varsaymaz ve hata mesajı neyin eksik olduğunu söyler:
fn cerceve<T>(x: T) -> String {
format!("[{}]", x)
}
// error[E0277]: `T` doesn't implement `std::fmt::Display`
// help: consider restricting type parameter `T`
// fn cerceve<T: std::fmt::Display>(x: T)Derleyicinin önerisini izlemek çoğu zaman doğru sınırı bulmanın en hızlı yoludur.
Uygulama Çerçevele
Yukarıdaki fn cerceve<T: Display>(x: T) -> String fonksiyonunu yaz. 5, "a" ve 2.5 için sonuçları boşlukla tek satırda yazdır.
Başlangıç kodu
use std::fmt::Display;
fn main() {
// buraya yaz
}Örnek çözüm
use std::fmt::Display;
fn cerceve<T: Display>(x: T) -> String {
format!("[{}]", x)
}
fn main() {
println!("{} {} {}", cerceve(5), cerceve("a"), cerceve(2.5));
}Beklenen çıktı
[5] [a] [2.5]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>cerceve(vec![1, 2])</code> neden derlenmez?
- Derlenir
- Vec<i32> Display uygulamaz Doğru cevap
- Vec generic olamaz
- İki eleman fazla
Açıklama: Vektörler {:?} (Debug) ile yazdırılır; {} için Display gerekir ve Vec bunu uygulamaz.
2 Yazdırılabilir
fn cerceve<T: ____>(x: T) -> String {
format!("[{}]", x)
}
fn cerceve<T: Display>(x: T) -> String {
format!("[{}]", x)
}
Açıklama: {} biçimi Display trait'ini gerektirir.
3 Sınır ve izin verdiği
| Kavram | Anlamı |
|---|---|
T: Display |
{} ile yazdırma |
T: Debug |
{:?} ile yazdırma |
T: PartialOrd |
< ve > karşılaştırma |
T: Clone |
.clone() |