irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
Rust öğrenmeye başlayan herkesin yaşadığı en büyük kafa karışıklığı, neden iki farklı string türü (
Rust'ta stringler, diğer dillerdeki kadar basit değildir çünkü bellek güvenliği ve performans ön plandadır.
fn selamla(isim: &str) {
println!("Selam {}", isim);
}
fn main() {
let s = String::from("Rustacean");
selamla(&s); // String'i &str olarak gönderiyoruz (Deref coercion)
}
String ve &str) olduğudur. Bu karmaşayı çözmek için belleğin derinliklerine inmemiz gerekiyor.Rust'ta stringler, diğer dillerdeki kadar basit değildir çünkü bellek güvenliği ve performans ön plandadır.
1. &str (String Slice)
&str, genellikle "string slice" veya "string literali" olarak adlandırılır.- Sabit ve Değiştirilemez: Programın binary dosyasına gömülüdür veya bir
String'e açılan geçici bir penceredir. - Referanstır: Verinin sahipliğine sahip değildir, sadece bellekteki bir yere işaret eder.
- Boyutu Sabittir: Çalışma zamanında büyütülüp küçültülemez.
Kod:
let s: &str = "Merhaba"; // Bu bir string literalidir ve &str tipindedir.
2. String (Heap Allocated)
String, standart kütüphane tarafından sağlanan, büyütülebilir, değiştirilebilir ve sahipliği size ait olan bir yapıdır.- Dinamik: Çalışma zamanında metin ekleyebilir veya silebilirsiniz.
- Heap Üzerinde Yaşar: Veri belleğin "heap" (öbek) bölgesinde tutulur.
- Sahiplik Sizdedir: Kapsam dışına çıktığında bellekten temizlenir.
Kod:
let mut s = String::from("Merhaba");
s.push_str(", Dünya!"); // Artık "Merhaba, Dünya!" oldu.
3. Bellek Farkı: Arka Planda Neler Oluyor?
Bu iki türün farkını anlamanın en iyi yolu bellekteki yerleşimlerine bakmaktır.- String: Stack üzerinde bir "başlık" (pointer, kapasite, uzunluk) ve Heap üzerinde asıl veriyi tutar.
- &str: Sadece bir pointer (başlangıç adresi) ve bir uzunluk (length) bilgisinden oluşur. Bu yüzden buna "fat pointer" denir.
4. Hangisini Ne Zaman Kullanmalı?
Bu karmaşayı çözmek için basit bir karar tablosu:| Durum | Tercih Edilen Tip | Neden? |
| Fonksiyon Parametreleri | &str | Daha esnektir; hem String hem de &str alabilir. |
| Veri Saklama (Struct) | String | Verinin sahipliğinin sizde olması gerekir (lifetime karmaşasından kaçmak için). |
| Metni Değiştirme | String | Üzerine ekleme yapacaksanız tek seçenek budur. |
| Sabit Metinler | &str | Bellek verimliliği sağlar. |
5. Dönüşümler (Conversion)
İki tür arasında geçiş yapmak çok kolaydır:- &str -> String: s.to_string() veya String::from(s)
- String -> &str: &s (referans alarak) veya s.as_str()
fn selamla(isim: &str) {
println!("Selam {}", isim);
}
fn main() {
let s = String::from("Rustacean");
selamla(&s); // String'i &str olarak gönderiyoruz (Deref coercion)
}