Gölgeleme, aynı isimdeki bir değişkenin bir kapsamda birden fazla kez tanımlanabilmesi olanağıdır; yeni değişken, önceki değişkeni "gölgelemiştir". Gölgeleme olmayan dillerde (C, C++) bir değişkenin yeniden tanımlanması hata veya belirsiz davranışa yol açar. Rust, gölgeleme işlemini kabul eder ve her değişken bağımsız bir nesne olarak yeni bir tür veya değerle oluşur. Değeri adım adım dönüştürmek için kullanışlıdır; örneğin, bir diziyi hemen sayıya çevirirken yeni isimler bulmaya gerek yoktur.
Sorun: Bir yandan okuma kolaylığı, değişken isimlerinin kabarmasını önlemek; diğer yandan ise karmaşık bir blokta değişkeni kazara "gölgelemek" ve beklenmedik bir sonuç elde etmek durumunda zayıf hata ayıklama.
Çözüm: Gölgeleme, gerçekten dönüşümü kolaylaştırdığı ve okunabilirliği kötüleştirmediği durumlarda kullanılmalıdır. Her "let var = ...;" yeni bir değişken oluşturur, eski değişken, tanım bloğunun dışında değişmez.
Kod örneği:
fn example() { let x = "42"; let x = x.parse::<i32>().unwrap(); println!("x: {}", x); // x: 42 }
Anahtar özellikler:
Gölgeleme değişkenin değiştirilebilirliğini değiştirebilir mi?
Evet, değiştirilemez bir değişkeni değiştirilebilir bir değişkenle "gölgeleyebilirsiniz" ve tersi de mümkündür:
let x = 5; let mut x = x; x += 1;
Gölgeleme, önceki değişkenin yok edildiği anlamına mı gelir?
Hayır, önceki değişkenin değerleri, tanımlandığı blok sona erene kadar yaşamaktadır; ancak ismiyle erişilemez hale gelir.
Gölgelemeyi döngü içinde veya iç içe bloklar içinde kullanabilir miyiz?
Evet, her kapsam (scope) aynı isme sahip değişkenler tanımlamaya izin verir ve bunlar farklı değişkenlerdir.
Fonksiyonda let result = expr1; ... let result = expr2; var, burada türler farklı.
Artılar:
Eksiler:
Gölgeleme yalnızca tür değiştirmek için kullanılmaktadır: önce bir diziyi ayrıştırma, ardından sayısal atama.
Artılar:
Eksiler: