Elision kuralları
- Rust kursu
- Orta seviye
- Ders 17/115
- 4 dk
Ömür elision (kısaltma) kurallarını öğrenirsin.
Elision kuralları
Çoğu fonksiyonda ömür yazmana gerek kalmamasının nedeni derleyicinin üç atlama (elision) kuralıdır:
- Her referans parametresi kendi ömrünü alır.
- Tam olarak bir referans parametresi varsa, onun ömrü tüm dönüş referanslarına verilir.
- Parametrelerden biri
&selfya da&mut selfise,self'in ömrü dönüşe verilir.
fn kisalt(s: &str) -> &str // kural 2: fn kisalt<'a>(s: &'a str) -> &'a str
fn ad(&self, ek: &str) -> &str // kural 3: dönüş self'e bağlıKurallar iş başında
Aşağıdaki iki fonksiyonda hiçbir ömür yazılmamıştır ama ikisi de geçerlidir:
fn kisalt(s: &str) -> &str {
s.get(..3).unwrap_or(s)
}
struct Kisi { ad: String }
impl Kisi {
fn ad(&self) -> &str {
&self.ad
}
}get(..3) güvenli dilimdir: metin 3 bayttan kısaysa ya da 3. bayt karakter ortasına düşerse None döner.
Uygulama Ömürsüz imzalar
Yukarıdaki kisalt fonksiyonunu ve Kisi türünün ad metodunu ömür yazmadan tanımla. kisalt("Programlama") ve Kisi { ad: "Ece".to_string() }.ad() sonuçlarını boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn kisalt(s: &str) -> &str {
s.get(..3).unwrap_or(s)
}
struct Kisi {
ad: String,
}
impl Kisi {
fn ad(&self) -> &str {
&self.ad
}
}
fn main() {
let k = Kisi { ad: "Ece".to_string() };
println!("{} {}", kisalt("Programlama"), k.ad());
}Beklenen çıktı
Pro Ece
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>fn f(a: &str, b: &str) -> &str</code> neden ömür ister?
- str ömür gerektirir her zaman
- İstemez
- İki referans parametresi var ve self yok; kural 2 ve 3 uygulanamıyor Doğru cevap
- Dönüş türü yanlış
Açıklama: Kurallar dönüş ömrünü belirleyemediğinde derleyici açıklama ister (E0106).
2 Atlanmış ömür
fn kisalt(s: &str) -> ____ {
s.get(..3).unwrap_or(s)
}
fn kisalt(s: &str) -> &str {
s.get(..3).unwrap_or(s)
}
Açıklama: Tek referans parametresi olduğu için dönüş ömrü otomatik ona bağlanır.
3 İmza ve uygulanan kural
| Kavram | Anlamı |
|---|---|
fn f(x: &str) -> &str |
Kural 2 |
fn f(&self, y: &str) -> &str |
Kural 3 |
fn f(x: &str, y: &str) |
Kural 1 (dönüş yok) |
fn f(x: &str, y: &str) -> &str |
Açıklama gerekir |