Fonksiyon ömürleri
- Rust kursu
- Orta seviye
- Ders 15/115
- 4 dk
Fonksiyon imzasında ömür kullanmayı öğrenirsin.
Fonksiyon ömürleri
Dönen referans yalnızca bir parametreye bağlıysa, ömrü yalnızca ona vermek çağıranı serbest bırakır:
fn once<'a>(s: &'a str, ayrac: &str) -> &'a str {
match s.find(ayrac) {
Some(i) => &s[..i],
None => s,
}
}ayrac'ın ömrü dönüşle ilgisizdir; çağrıdan hemen sonra bırakılabilir. Her iki parametreye de 'a verseydik ayraç gereksiz yere uzun yaşamak zorunda kalırdı.
Farklı ömürler
İki parametrenin birbirinden bağımsız ömürleri gerekiyorsa iki ömür parametresi kullanılır:
fn sec<'a, 'b>(birinci: &'a str, _ikinci: &'b str) -> &'a str {
birinci
}Derleyici imzaya bakarak _ikinci'nin sonuçtan önce bırakılabileceğini bilir. Fonksiyon gövdesi imzanın vaat ettiğinden fazlasını yapamaz: _ikinci'yi döndürmeye çalışmak derleme hatasıdır.
Uygulama Ayraçtan önce
Yukarıdaki once fonksiyonunu yaz. let metin = "ad=Ece"; için ayracı iç bir blokta String::from("=") olarak oluştur, sonucu bloğun dışındaki bir değişkene ata ve bloktan sonra yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn once<'a>(s: &'a str, ayrac: &str) -> &'a str {
match s.find(ayrac) {
Some(i) => &s[..i],
None => s,
}
}
fn main() {
let metin = "ad=Ece";
let sonuc;
{
let a = String::from("=");
sonuc = once(metin, &a);
}
println!("{}", sonuc);
}Beklenen çıktı
ad
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>fn f<'a>(x: &str) -> &'a str { let s = String::from("a"); &s }</code> neden derlenmez?
- Yerel bir değere referans döndürülemez; s fonksiyon sonunda bırakılır Doğru cevap
- 'a kullanılmamış
- x kullanılmamış
- Derlenir
Açıklama: Dönen referans ya bir parametreden gelmeli ya da 'static olmalı. Yeni üretilen veri için String döndür.
2 Yalnızca ilk parametre
fn once<'a>(s: &'a str, ayrac: ____) -> &'a str {
match s.find(ayrac) {
Some(i) => &s[..i],
None => s,
}
}
fn once<'a>(s: &'a str, ayrac: &str) -> &'a str {
match s.find(ayrac) {
Some(i) => &s[..i],
None => s,
}
}
Açıklama: Ayraç dönüşe katılmadığı için ömür açıklamasına gerek yoktur.
3 İmza ve anlamı
| Kavram | Anlamı |
|---|---|
(x: &'a str, y: &'a str) -> &'a str |
Dönüş ikisine bağlı |
(x: &'a str, y: &str) -> &'a str |
Dönüş yalnızca x'e bağlı |
fn f(x: &str) -> String |
Ömür gerekmez |
fn f<'a>() -> &'a str |
Yalnızca 'static olabilir |