Özet - Trait'ler
- Rust kursu
- Orta seviye
- Ders 6/115
- 5 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
#[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
#[derive(Debug, ____)]
struct Nokta { x: i32, y: i32 }
// a == b artık yazılabilir
#[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() |