Shadowing variable di Rust

Apa itu shadowing variable, shadowing variable adalah di mana variabel yang dideklarasikan dalam lingkup (scope) lokal memiliki nama yang sama dengan variabel di lingkup global, untuk saya yang lebih sering menggunakan Java shadowing variable ini seolah - olah, jarang kelihatan karena oleh linter ketika kita membuat variable yang sama pada scope yang sama maka akan di highlight merah dan compiler akan memberitahu kalau variable ini sudah di declare sebagai contoh, ini bukan shadowing ini
private void sayName(String name){
// compiler akan memberitahu jika variable ini sudah di deklaraskikan
String name = "Hello world";
System.out.println(name)
}
contoh lain shadowing variable adalah variable antara inner class dan outerclass
class OuterClass {
String name = "outer name";
Class InnerClass {
String name = "inner name"
private void print(String name){
System.out.println(name)
System.out.println(this.name);
System.out.println(OutterClass.this.name);
}
}
}
Jika kita lihat disana sebenarnya pada Java ada shadowing variable tapi untuk menghilangkan ke ambiguan ini pada Java ada keyword this , yang mana ini membuat kita lebih mudah membaca program di Java, terus bagaimana shadowing variable di Rust?
Shadowing variable pada Rust kurang lebih agak mirip-mirip dengan shadowing variable di JavaScript, jadi kita bisa declare variable dengan nama yang sama untuk tipe data juga boleh beda, yang perlu di ingat adalah value terakhir yang akan digunakan adalah value terakhir yang di deklarasikan contoh
fn main(){
let a = 10;
let a = String::from("hello");
println!("{}", a);
}
Mungkin kita akan mikir ulang, ini kenapa perlu ada shadowing karena kalau keseringan dipakai bikin pusing bacanya, yup pertanyaan ini benar jika di implemntasikan di Java tapi jika di Rust mungkin akan menjadi keunggulan kalau dipikir, contohnya
fn increment(num: i32) -> i32 {
return num + 1;
}
fn main() {
let input_str = "42";
let input_parsed = input_str.parse::<i32>().unwrap();
let input_incremented = increment(input_parsed);
let input_final = input_incremented + 3;
println!("{}", input_final);
}
kalau dilihat diatas kita bakalan sibuk mikirin nama variable untuk setiap proses, coba kita lihat ketika kita meleverage manfaat shadowing
fn increment(num: i32) -> i32 {
return num + 1;
}
fn main() {
let input = "42";
let input = input.parse::<i32>().unwrap();
let input = increment(input);
let input = input + 3;
println!("{}", input);
}
lebih clean bukan dan kita bisa lebih fokus ke proses apa yang sebenarnya terjadi, namum perlu di note shadowing ini kaya pedang bermata dua kalau tidak wise menggunakannya ya pusing juga.
![[Config] Konfigurasi VPS Linux](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fstock%2Funsplash%2F40XgDxBfYXM%2Fupload%2F4abd040c2310d933545447e36e0aa765.jpeg&w=3840&q=75)
![[Error] npx create-react-app](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fstock%2Funsplash%2FO_Xy25Dj7Mo%2Fupload%2F857d641313b8e971d5d750198efa52d0.jpeg&w=3840&q=75)
