변수 섀도잉
이해
Rust에서 let 또는 let mut으로 선언한 변수 a를 이후에 같은 이름으로 다시 선언하면 이를 섀도잉(shadowing)이라고 합니다.
const상수는 섀도잉할 수 없습니다.- 섀도잉에는 블록(
{}) 범위를 적용할 수 있습니다. - 같은 변수 이름을 유지하면서 새로운 데이터 형식으로 다시 선언할 수 있습니다.
출처
https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#shadowing
fn main() {
let x = 5;
let x = x + 1;
{
let x = x * 2;
println!("The value of x in the inner scope is: {}", x);
}
println!("The value of x is: {}", x);
}
이 프로그램은 먼저 x를 5에 바인딩합니다. 그런 다음 let x =를 다시 작성해 x를 섀도잉하고, 원래 값에 1을 더해 x를 6으로 만듭니다. 이어지는 내부 범위에서는 세 번째 let 문이 다시 x를 섀도잉하고, 이전 값에 2를 곱해 x를 12로 만듭니다. 해당 범위가 끝나면 내부 섀도잉도 끝나고 x는 다시 6이 됩니다. 이 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
$ cargo run
Compiling variables v0.1.0 (file:///projects/variables)
Finished dev [unoptimized + debuginfo] target(s) in 0.31s
Running `target/debug/variables`
The value of x in the inner scope is: 12
The value of x is: 6
섀도잉은 변수에 mut를 붙이는 것과 다릅니다. let 키워드를 사용하지 않고 실수로 이 변수에 다시 값을 대입하려 하면 컴파일 시 오류가 발생하기 때문입니다. let을 사용하면 값에 몇 가지 변환을 수행한 뒤 변환이 끝난 후에는 변수를 불변으로 둘 수 있습니다.
mut와 섀도잉의 또 다른 차이는 let 키워드를 다시 사용할 때 사실상 새 변수를 만들기 때문에, 같은 이름을 재사용하면서 값의 형식을 바꿀 수 있다는 점입니다. 예를 들어 사용자가 텍스트 사이에 넣고 싶은 공백 수를 공백 문자로 입력한다고 해 봅시다. 우리는 그 입력을 숫자로 저장하고 싶을 수 있습니다.
let spaces = " ";
let spaces = spaces.len();
첫 번째 spaces 변수는 문자열 형식이고, 첫 번째 변수와 같은 이름을 가졌지만 실제로는 새로 만들어진 두 번째 spaces 변수는 숫자 형식이므로 이 구문은 허용됩니다. 따라서 spaces_str와 spaces_num처럼 서로 다른 이름을 만들 필요 없이 더 간단한 spaces 이름을 재사용할 수 있습니다. 그러나 다음과 같이 mut를 사용하면 컴파일 시 오류가 발생합니다.
let mut spaces = " ";
spaces = spaces.len();
오류 메시지는 변수의 형식을 변경할 수 없다고 알려 줍니다.
$ cargo run
Compiling variables v0.1.0 (file:///projects/variables)
error[E0308]: mismatched types
--> src/main.rs:3:14
|
3 | spaces = spaces.len();
| ^^^^^^^^^^^^ expected `&str`, found `usize`
For more information about this error, try `rustc --explain E0308`.
error: could not compile `variables` due to previous error