CodeBlanks Logo Icon CodeBlanks

where clause

where ile uzun trait sınırlarını okunabilir biçimde yazarsın.

where clause

Sınırlar uzadığında imza okunmaz hale gelir. where yan tümcesi sınırları imzanın sonuna taşır:

use std::fmt::{Debug, Display};

fn ozetle<T, U>(a: &T, b: &U) -> String
where
    T: Display,
    U: Debug,
{
    format!("{a} / {b:?}")
}

Anlam aynıdır; yalnızca yazım farklıdır. Birden çok tür parametresi ya da uzun sınırlar varsa where tercih edilir.

İlişkili tür sınırı

where, bir trait'in ilişkili türüne sınır koymak için de kullanılır. Örneğin herhangi bir yineleyicinin elemanlarını yazdırmak:

fn hepsini_yaz<I>(it: I)
where
    I: Iterator,
    I::Item: std::fmt::Display,
{
    for x in it {
        print!("{x} ");
    }
    println!();
}

hepsini_yaz([1, 2, 3].iter());   // 1 2 3

Uygulama Özetle

Yukarıdaki ozetle fonksiyonunu where ile yaz. ozetle(&42, &vec![1, 2]) sonucunu yazdır.

Başlangıç kodu

main.rs
use std::fmt::{Debug, Display};

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::fmt::{Debug, Display};

fn ozetle<T, U>(a: &T, b: &U) -> String
where
    T: Display,
    U: Debug,
{
    format!("{a} / {b:?}")
}

fn main() {
    println!("{}", ozetle(&42, &vec![1, 2]));
}

Beklenen çıktı

42 / [1, 2]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>where</code> ile yazılabilip satır içi sınırla yazılamayan şey hangisi?

  • T: Display
  • T: Clone + Debug
  • Hiçbiri
  • Tür parametresi olmayan türlere sınır: where Vec<T>: Debug Doğru cevap

Açıklama: where daha esnektir; karmaşık türler ve ilişkili türler (T::Item: Display) için sınır yazmayı sağlar.

2 Sınırları sona taşı

Soru
fn ozetle<T, U>(a: &T, b: &U) -> String
____
    T: Display,
    U: Debug,
{
    format!("{a} / {b:?}")
}
Cevap
fn ozetle<T, U>(a: &T, b: &U) -> String
where
    T: Display,
    U: Debug,
{
    format!("{a} / {b:?}")
}

Açıklama: where yan tümcesi sınırları imzadan sonra listeler.

3 Yazım ve anlamı

Kavram Anlamı
fn f<T: Display>(x: T) Satır içi sınır
where T: Display where sınırı
I::Item: Display İlişkili tür sınırı
T: Display, U: Debug İki parametre, iki sınır

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