Özet - Generic'ler
- Rust kursu
- Orta seviye
- Ders 12/115
- 5 dk
Generic struct, metod ve enum'u birleştirerek bir Pair<T> yazarsın.
Generic'ler özeti
Generic'ler kodu türden bağımsız yazmayı sağlar: fonksiyonlar (fn f<T>), struct'lar (struct S<T>), enum'lar (enum E<T>) ve metotlar (impl<T> S<T>). Trait sınırları T ile ne yapılabileceğini söyler. Somut türe özel impl S<f64> yazılabilir. Tür çıkarılamazsa turbofish ::<T> kullanılır. Monomorfizasyon sayesinde çalışma anı maliyeti yoktur.
Takas fonksiyonu
Hiçbir trait sınırı gerektirmeyen generic'ler de vardır: yalnızca değerleri taşıyan bir fonksiyon T hakkında hiçbir şey bilmek zorunda değildir:
fn takas<T>(c: (T, T)) -> (T, T) {
(c.1, c.0)
}
println!("{:?}", takas((1, 2))); // (2, 1)Ancak {:?} ile yazdırmak çağıran tarafta yapıldığı için orada T: Debug gerekir, fonksiyonun kendisinde değil.
Uygulama Takas
Yukarıdaki fn takas<T>(c: (T, T)) -> (T, T) fonksiyonunu yaz. takas((1, 2)) ve takas(("a", "b")) sonuçlarını {:?} ile boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn takas<T>(c: (T, T)) -> (T, T) {
(c.1, c.0)
}
fn main() {
println!("{:?} {:?}", takas((1, 2)), takas(("a", "b")));
}Beklenen çıktı
(2, 1) ("b", "a")
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Generic bir fonksiyon 3 farklı türle çağrılırsa derleyici kaç kopya üretir?
- 3 Doğru cevap
- 1
- Çalışma anında karar verilir
- 0
Açıklama: Monomorfizasyon her somut tür için ayrı, optimize edilmiş bir sürüm üretir.
2 Sınırsız generic
fn takas____(c: (T, T)) -> (T, T) {
(c.1, c.0)
}
fn takas<T>(c: (T, T)) -> (T, T) {
(c.1, c.0)
}
Açıklama: Değerleri yalnızca taşıyan bir fonksiyon için sınır gerekmez.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
fn f<T>(x: T) |
Generic fonksiyon |
struct S<T> |
Generic struct |
impl<T> S<T> |
Generic metotlar |
::<T> |
Turbofish |