CodeBlanks Logo Icon CodeBlanks

Generic struct

Generic struct tanımlamayı ve kullanmayı öğrenirsin.

Generic struct

Struct alanları da generic olabilir. Tek tür parametresi tüm alanların aynı türde olmasını, iki parametre farklı olabilmesini sağlar:

struct Cift<T> {
    a: T,
    b: T,
}

struct Nokta<T, U> {
    x: T,
    y: U,
}

let p = Cift { a: 3, b: 7 };          // Cift<i32>
let q = Nokta { x: 5, y: 2.5 };       // Nokta<i32, f64>

Vec<T>, Option<T> ve HashMap<K, V> standart kütüphanedeki generic türlerdir.

Ne zaman generic?

Bir struct'ı generic yapmak, aynı mantığın farklı içeriklerle tekrar kullanılacağı durumlar içindir: kap türleri (yığın, kuyruk, önbellek), çiftler, sarmalayıcılar. Yalnızca tek bir türle kullanılacaksa somut tür yazmak daha okunaklıdır.

struct Kutu<T> {
    icerik: T,
}

let sayi = Kutu { icerik: 42 };
let metin = Kutu { icerik: "rust" };
println!("{} {}", sayi.icerik, metin.icerik);   // 42 rust

Uygulama Çiftler

struct Cift<T> { a: T, b: T } tanımla. p = Cift { a: 3, b: 7 } ve q = Cift { a: "x", b: "y" } oluştur; p.a + p.b ve q.b değerlerini boşlukla yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Cift<T> {
    a: T,
    b: T,
}

fn main() {
    let p = Cift { a: 3, b: 7 };
    let q = Cift { a: "x", b: "y" };
    println!("{} {}", p.a + p.b, q.b);
}

Beklenen çıktı

10 y

Soru ve cevaplar

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

1 <code>Cift { a: 3, b: 2.5 }</code> neden derlenmez?

  • a ve b aynı T türünde olmalı; i32 ile f64 farklı Doğru cevap
  • Cift generic değil
  • Ondalıklı sayı kullanılamaz
  • Derlenir

Açıklama: Farklı türler için Nokta<T, U> gibi iki tür parametresi gerekir.

2 İki tür

Soru
struct Nokta____ {
    x: T,
    y: U,
}
Cevap
struct Nokta<T, U> {
    x: T,
    y: U,
}

Açıklama: Farklı türdeki alanlar için iki tür parametresi tanımlanır.

3 İfade ve türü

Kavram Anlamı
Cift { a: 3, b: 7 } Cift<i32>
Cift { a: "x", b: "y" } Cift<&str>
Nokta { x: 5, y: 2.5 } Nokta<i32, f64>
Kutu { icerik: true } Kutu<bool>

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