Strings: String ve &str Arasındaki Karmaşayı Çözün

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

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ü (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.
Rust

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.
Rust

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:
DurumTercih Edilen TipNeden?
Fonksiyon Parametreleri&strDaha esnektir; hem String hem de &str alabilir.
Veri Saklama (Struct)StringVerinin sahipliğinin sizde olması gerekir (lifetime karmaşasından kaçmak için).
Metni DeğiştirmeStringÜzerine ekleme yapacaksanız tek seçenek budur.
Sabit Metinler&strBellek 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()
Rust

fn selamla(isim: &str) {
println!("Selam {}", isim);
}

fn main() {
let s = String::from("Rustacean");
selamla(&s); // String'i &str olarak gönderiyoruz (Deref coercion)
}

Özet: Karmaşanın Formülü​

String bir veri sahibidir (ev sahibi), &str ise o veriye bakan bir misafirdir. Ev sahibi evi istediği gibi büyütebilir, misafir ise sadece bakabilir ve süresi dolunca (scope bitince) oradan ayrılır.
 
Geri
Üst