Rust'ta bir değişkenin görünürlük alanı, bir blokla (kademeli süslü parantez {}) sınırlıdır. Mevcut veya dış görünürlük alanında aynı isimde yeni bir değişkenin ilan edilmesine gölgeleme ("shadowing") denir. Gölgeleme, değişkenin tipini ve değerini değiştirirken, değişkenin değişmezlik (immutability) kavramını ihlal etmemizi sağlar.
Örnek:
let x = 5; // x: i32 = 5 let x = x + 1; // x: i32 = 6 (eski x'i gölgeliyor) let x = "hello"; // x: &str = "hello" (tip değişti)
Gölgeleme performansı etkilemez (bu tamamen sözdizimsel bir yapı olup, LLVM IR seviyesinde farklı değişkenler olarak derlenir), ancak kodun okunabilirliği ve sürdürülmesi üzerinde önemli bir olumsuz etkisi olabilir, mantıksal hatalar yapma riskini artırır.
Soru: Gölgelenen bir değişken, önceki değişken bellek üzerinde sahiplik (örneğin, String) taşıyorsa, kaynak temizliğine yol açar mı?
Sıklıkla verilen cevap: Hayır, çünkü değişken sadece "yeniden tanımlanıyor".
Doğru cevap: Evet, bir değişken gölgelendiğinde, eski değer görünürlük alanının dışına çıkar ve eğer bu değer bir kaynağa sahip idiyse, Drop çağrılır. Bu, bellek yönetiminin düzgün bir şekilde yapıldığını sağlar.
Örnek:
let s = String::from("abc"); let s = 5; // String burada serbest bırakılır (Drop çağrıldı)
Hikaye
Genç bir geliştirici, açık bir dosya tanımlayıcısına sahip bir yapıda gölgeleme kullanmış ve daha önce düşünülenden daha erken bir değişkeni gölgelendiği için dosyayı iş bitmeden kapatmıştı. Bu bazı durumlarda veri kaybına neden oldu.
Hikaye
Bir araştırma projesinde, aynı iç içe bulunma seviyesine sahip değişkenler için gölgeleme uygulanmış ve geliştiriciler sıkça karışıklığa düşerek "eski" değişken değerine atıfta bulunmuşlardı, bunun güncel olduğunu düşünerek.
Hikaye
Büyük bir sunucu uygulamasında, bir yapının alanının ve bir metodun içindeki değişkenin örtük gölgelenmesi, alanın değiştirilmemesi ancak aynı isme sahip yeni bir yerel değişkenin değiştirilmesi nedeniyle görünmeyen bir hataya yol açtı. Sistem davranışındaki yanlışlıkların nedenlerini bulmak uzun bir arayış sonrası tespit edildi.