CodeBlanks Logo Icon CodeBlanks

Trait bound

<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

main.rs
use std::fmt::Display;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
fn cerceve<T: ____>(x: T) -> String {
    format!("[{}]", x)
}
Cevap
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()

Orta seviye bölümündeki tüm dersler