Dönüş ve sahiplik
- Rust kursu
- Başlangıç
- Ders 46/115
- 4 dk
Fonksiyondan değer döndürmenin sahiplik üzerindeki etkisini öğrenirsin.
Dönüş ve sahiplik
Fonksiyon bir değer döndürünce sahiplik çağırana taşınır. Bu, fonksiyon içinde oluşturulan değerlerin güvenle dışarı verilmesini sağlar:
fn yeni_liste() -> Vec<i32> {
let v = vec![1, 2, 3];
v // sahiplik çağırana geçer, drop edilmez
}
fn ekle_unlem(mut s: String) -> String {
s.push('!');
s // aynı String geri verilir, kopya yok
}Sahipliği verip geri almak
Bir değeri fonksiyona verip sonra geri almak için onu döndürmek mümkündür ama zahmetlidir:
fn uzunluk_ver(s: String) -> (String, usize) {
let n = s.len();
(s, n)
}
let (s, n) = uzunluk_ver(String::from("Rust"));Bu yüzden Rust'ta bu iş için referanslar kullanılır: fonksiyon değeri ödünç alır ve sahiplik hiç el değiştirmez. Bir sonraki grup bu konudadır.
Uygulama Dönüştür ve geri ver
fn ekle_unlem(mut s: String) -> String yaz; sona '!' ekleyip s'yi döndürsün. let s = ekle_unlem(String::from("Merhaba")); ile çağırıp yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn ekle_unlem(mut s: String) -> String {
s.push('!');
s
}
fn main() {
let s = ekle_unlem(String::from("Merhaba"));
println!("{}", s);
}Beklenen çıktı
Merhaba!
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir fonksiyon yerel <code>String</code>'ine referans (<code>&String</code>) döndürebilir mi?
- Evet, her zaman
- Yalnızca mut ile
- Yalnızca clone ile
- Hayır; değer fonksiyon sonunda drop edilir, referans boşa düşerdi Doğru cevap
Açıklama: Derleyici sarkan referansı (dangling reference) reddeder; çözüm String'in kendisini döndürüp sahipliği aktarmaktır.
2 Sahipliği geri ver
fn buyut(mut s: String) -> String {
s.make_ascii_uppercase();
____
}
fn buyut(mut s: String) -> String {
s.make_ascii_uppercase();
s
}
Açıklama: Son ifade olarak s yazmak String'in sahipliğini çağırana taşır.
3 Kod ve sonuç
| Kavram | Anlamı |
|---|---|
-> String (yerel değer) |
Sahiplik çağırana geçer |
-> &String (yerel değer) |
Derleme hatası |
(s, n) döndürmek |
Sahipliği geri vermek |
&s parametresi |
Ödünç alma |