CodeBlanks Logo Icon CodeBlanks

Özet - Trait'ler

Trait ve impl'i birleştirerek bir Summary trait'i yazarsın.

Trait'ler özeti

Trait bir davranış sözleşmesidir: trait T { fn m(&self); }, uygulama impl T for Tür. Metotların varsayılan gövdesi olabilir ve ezilebilir. Parametrelerde &impl T ya da <X: T> ile davranış istenir; + birden çok trait birleştirir. Yetim kuralı: trait ya da türden biri senin olmalı. Sık trait'ler #[derive(..)] ile otomatik uygulanır: Debug, Clone, PartialEq, Default, Hash.

derive ile hazır trait'ler

Pek çok standart trait'i elle yazmaya gerek yoktur:

#[derive(Debug, Clone, PartialEq, Default)]
struct Nokta {
    x: i32,
    y: i32,
}

let a = Nokta { x: 1, y: 2 };
let b = a.clone();
println!("{:?} {}", b, a == b);           // Nokta { x: 1, y: 2 } true
println!("{:?}", Nokta::default());       // Nokta { x: 0, y: 0 }

Copy yalnızca tüm alanlar Copy ise türetilebilir ve Clone ile birlikte yazılır.

Uygulama Türetilmiş trait'ler

#[derive(Debug, Clone, PartialEq)] ile Nokta { x: i32, y: i32 } tanımla. a = Nokta { x: 1, y: 2 }, b = a.clone() olsun; b'yi {:?} ile ve a == b sonucunu boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
#[derive(Debug, Clone, PartialEq)]
struct Nokta {
    x: i32,
    y: i32,
}

fn main() {
    let a = Nokta { x: 1, y: 2 };
    let b = a.clone();
    println!("{:?} {}", b, a == b);
}

Beklenen çıktı

Nokta { x: 1, y: 2 } true

Soru ve cevaplar

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

1 <code>#[derive(Clone)]</code> bir struct'a ne kazandırır?

  • == karşılaştırmasını
  • {:?} yazdırmayı
  • Tüm alanları kopyalayan .clone() metodunu Doğru cevap
  • Otomatik Copy davranışını

Açıklama: derive(Clone), her alanın clone'unu çağıran bir uygulama üretir; bunun için tüm alanlar Clone olmalıdır.

2 Karşılaştırma ekle

Soru
#[derive(Debug, ____)]
struct Nokta { x: i32, y: i32 }
// a == b artık yazılabilir
Cevap
#[derive(Debug, PartialEq)]
struct Nokta { x: i32, y: i32 }
// a == b artık yazılabilir

Açıklama: PartialEq == ve != operatörlerini sağlar.

3 derive ve kazandırdığı

Kavram Anlamı
Debug {:?}
Clone .clone()
PartialEq == ve !=
Default Tür::default()

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