바인딩
변수에 간접적으로 접근하면 재바인딩 없이 해당 변수를 분기하고 사용하는 것이 불가능합니다. match는 값을 이름에 바인딩하기 위한 @ 기호를 제공합니다:
// `u32`를 반환하는 `age` 함수.
fn age() -> u32 {
15
}
fn main() {
println!("당신이 어떤 종류의 사람인지 말해주세요");
match age() {
0 => println!("아직 첫 번째 생일을 맞이하지 않았습니다"),
// 1 ..= 12를 직접 `match`할 수 있지만, 그러면
// 아이의 나이가 몇 살인지 알 수 있을까요?
// n을 `match`하고 `if` 가드를 사용할 수 있지만,
// 이는 철저함(exhaustiveness) 검사에 기여하지 않습니다.
// (비록 이 경우에는 하단에 "catch-all" 패턴이 있어 상관없지만요)
// 대신, 1 ..= 12 시퀀스에 대해 `n`에 바인딩합니다.
// 이제 나이를 보고할 수 있습니다.
n @ 1 ..= 12 => println!("저는 {:?}살인 어린이입니다", n),
n @ 13 ..= 19 => println!("저는 {:?}살인 청소년입니다", n),
// 여러 값을 매칭할 때도 유사한 바인딩을 수행할 수 있습니다.
n @ (1 | 7 | 15 | 13) => println!("저는 {:?}살인 청소년입니다", n),
// 바인딩된 것이 없습니다. 결과를 반환합니다.
n => println!("저는 {:?}살인 어르신입니다", n),
}
}
또한 Option과 같은 enum 변체를 “구조 분해“하기 위해 바인딩을 사용할 수 있습니다:
fn some_number() -> Option<u32> {
Some(42)
}
fn main() {
match some_number() {
// `Some` 변체를 얻었을 때, `n`에 바인딩된 그 값이
// 42와 같은지 매칭합니다.
// `Some(42)`를 사용하여 `"정답: 42!"`를 출력할 수도 있지만,
// 그러면 나중에 값을 바꾸고 싶을 때 두 군데를 수정해야 합니다.
// `Some(n) if n == 42`를 사용하여 `"정답: {n}!"`를 출력할 수도 있지만,
// 이는 철저함 검사에 기여하지 않습니다.
// (비록 이 경우에는 다음 팔이 "catch-all" 패턴이라 상관없지만요)
Some(n @ 42) => println!("정답: {}!", n),
// 다른 모든 숫자 매칭.
Some(n) => println!("흥미롭지 않네요... {}", n),
// 그 외의 모든 경우(`None` 변체) 매칭.
_ => (),
}
}