irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
Rust'ta Slices (Dilimler), bir koleksiyonun (dizi, string veya vektör) tamamına değil, sadece belirli bir bitişik parçasına atıfta bulunmanızı sağlayan özel bir referans türüdür. Slices, verinin sahipliğini almaz; sadece bellekteki o bölgeye güvenli bir pencere açar.
Rust
let s = String::from("Merhaba Dunya");
let merhaba = &s[0..7]; // "Merhaba"
let dunya = &s[8..13]; // "Dunya"
Rust
let sayilar = [10, 20, 30, 40, 50];
let dilim: &[i32] = &sayilar[1..4]; // [20, 30, 40]
assert_eq!(dilim, &[20, 30, 40]);
Bu dilimin tipi &[i32] şeklindedir. Bellek güvenliği açısından Rust, dilim sınırlarının dışına çıkmanıza izin vermez; bu durum derleme veya çalışma zamanında kontrol edilir.
1. String Slices (
Bir String verisinin sadece bir kısmını (örneğin ilk kelimesini) almak istediğinizde, veriyi kopyalayıp yeni bir değişken oluşturmak yerine bir "dilim" oluşturursunuz.Rust
let s = String::from("Merhaba Dunya");
let merhaba = &s[0..7]; // "Merhaba"
let dunya = &s[8..13]; // "Dunya"
- &s[0..7] ifadesindeki [başlangıç_indeksi..bitiş_indeksi] yapısı, dilimin sınırlarını belirler. Başlangıç dahil, bitiş hariçtir.
- Bellek Yapısı: Bir slice aslında bir "fat pointer"dır (şişman işaretçi). Bellekte iki bilgi tutar: Verinin başladığı adres ve dilimin uzunluğu.
2. Slice Aralıkları (Range Syntax)
Rust, aralıkları belirtmek için kısa yollar sunar:- [..5]: Baştan başla, 5. indekse kadar git.
- [3..]: 3. indeksten başla, sona kadar git.
- [..]: Tüm koleksiyonu kapsayan bir dilim al.
3. String Literalleri ve
Şu ana kadar kullandığınız "Merhaba" gibi sabit stringler aslında birer String Slice'tır. Bunlar programın binary dosyasına gömülüdür ve tipleri &str'dir. Bu nedenle değiştirilemezler (immutable).Altın Kural: Fonksiyon tasarlarken, parametre olarak &String yerine &str kullanmak daha esnektir. Çünkü &str hem String dilimlerini hem de doğrudan string literallerini kabul eder.
4. Diğer Slice Türleri (Dizi Dilimleri)
Slices sadece stringlere özgü değildir. Diziler (Array) üzerinde de dilimleme yapabilirsiniz.Rust
let sayilar = [10, 20, 30, 40, 50];
let dilim: &[i32] = &sayilar[1..4]; // [20, 30, 40]
assert_eq!(dilim, &[20, 30, 40]);
Bu dilimin tipi &[i32] şeklindedir. Bellek güvenliği açısından Rust, dilim sınırlarının dışına çıkmanıza izin vermez; bu durum derleme veya çalışma zamanında kontrol edilir.
5. Neden Slices Kullanmalıyız?
- Performans: Veriyi kopyalamaz (Zero-copy). Sadece bir adres ve uzunluk bilgisidir.
- Güvenlik: Rust'ın Borrow Checker'ı sayesinde, bir dilim geçerliyken asıl verinin değiştirilmesini veya silinmesini engeller.
- Hata Önleme: Verinin senkronizasyonunu sağlar. Örneğin, bir stringin indeksini manuel tutmak yerine dilim kullanmak, string değiştiğinde geçersiz indekse erişme riskini ortadan kaldırır.
Özet
- Slice, verinin sahipliğini almayan bir referanstır.
- &str, string verisinin bir parçasına işaret eder.
- &[T], bir dizinin bir parçasına işaret eder.
- Koleksiyonun alt kümeleriyle çalışırken kopyalama yapmadan işlem yapmanızı sağlar.