Generic fonksiyon
- Rust kursu
- Orta seviye
- Ders 7/115
- 4 dk
<T> ile generic fonksiyon yazmayı öğrenirsin.
Generic fonksiyon
Generic'ler, aynı kodu farklı türlerle çalıştırmayı sağlar. Tür parametresi açılı parantezde tanımlanır ve trait sınırlarıyla ne yapılabileceği söylenir:
fn en_buyuk<T: PartialOrd + Copy>(v: &[T]) -> T {
let mut eb = v[0];
for &x in v {
if x > eb {
eb = x;
}
}
eb
}PartialOrd olmadan > kullanılamaz; Copy olmadan v[0] dilimden dışarı kopyalanamaz.
Monomorfizasyon
Derleyici, generic fonksiyonu kullanıldığı her somut tür için ayrı ayrı üretir. en_buyuk(&[1, 2]) ve en_buyuk(&['a', 'b']) çağrıları iki ayrı makine kodu oluşturur:
// derleyicinin ürettiği (kavramsal olarak)
fn en_buyuk_i32(v: &[i32]) -> i32 { .. }
fn en_buyuk_char(v: &[char]) -> char { .. }Bu yüzden generic'lerin çalışma anı maliyeti yoktur; bedeli biraz daha uzun derleme süresi ve daha büyük ikili dosyadır.
Uygulama En büyüğü bul
Yukarıdaki en_buyuk<T: PartialOrd + Copy> fonksiyonunu yaz. [3, 9, 2], ['a', 'z', 'm'] ve [1.5, 2.5, 0.5] için sonuçları boşlukla tek satırda yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn en_buyuk<T: PartialOrd + Copy>(v: &[T]) -> T {
let mut eb = v[0];
for &x in v {
if x > eb {
eb = x;
}
}
eb
}
fn main() {
println!("{} {} {}", en_buyuk(&[3, 9, 2]), en_buyuk(&['a', 'z', 'm']), en_buyuk(&[1.5, 2.5, 0.5]));
}Beklenen çıktı
9 z 2.5
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>fn f<T>(a: T, b: T) -> T { a + b }</code> neden derlenmez?
- Derlenir
- T için toplama tanımlı olduğu bilinmiyor; T: std::ops::Add<Output = T> gerekir Doğru cevap
- Generic fonksiyon değer döndüremez
- İki parametre aynı türde olamaz
Açıklama: Generic koddaki her işlem bir trait sınırıyla güvenceye alınmalıdır; derleyici T hakkında başka bir şey varsaymaz.
2 Tür parametresi
fn en_buyuk____(v: &[T]) -> T {
// ...
}
fn en_buyuk<T: PartialOrd + Copy>(v: &[T]) -> T {
// ...
}
Açıklama: Karşılaştırma ve kopyalama için T'ye PartialOrd ve Copy sınırı gerekir.
3 Çağrı ve T
| Kavram | Anlamı |
|---|---|
en_buyuk(&[3, 9, 2]) |
i32 |
en_buyuk(&['a', 'z']) |
char |
en_buyuk(&[1.5, 2.5]) |
f64 |
en_buyuk(&[1u8, 7]) |
u8 |