Rust의 가장 강력한 기능 중 하나는 match 명령을 통해 구현된 패턴 매칭입니다. Rust 1.26의 출시와 함께 "match ergonomics"라는 용어가 등장했으며, 이는 매치 표현식 내에서 참조 값의 언박싱 및 자동 역참조의 새로운 논리로, 명시적인 ref 및 *의 수를 줄이는 것을 목표로 합니다.
match ergonomics가 등장하기 전, 값이 참조로 래핑된 enum을 사용할 때 (예: Option<&T>), 패턴의 역참조를 명시적으로 지정해야 했습니다:
let opt: Option<&i32> = Some(&10); match opt { Some(&val) => { /* ... */ }, None => {}, }
이것은 가독성을 떨어뜨리고 복잡한 구조에서 역참조 수준을 잘못 설정할 가능성을 높였습니다.
match ergonomics가 도입되면서 Rust는 자동으로 패턴에서 참조를 역참조하여 더 간단하고 자연스러운 코드를 작성할 수 있도록 합니다:
let opt: Option<&i32> = Some(&10); match opt { Some(val) => println!("{}", val), None => (), }
컴파일러는 프로그래머의 편의를 위해 &i32를 i32로 역참조해야 함을 "이해"합니다. 이 기능은 Option, Result 및 참조가 포함된 조합으로 작업할 때 큰 도움을 줍니다.
주요 특징:
* 및 ref의 수 감소패턴에서 ref를 사용하는 것과 값에 대한 참조를 사용하는 것 (예: ref val vs &val)의 차이는 무엇인가요?
ref는 스택에 있는 값에 대한 참조를 생성하는 반면, &val은 이미 존재하는 참조와 매칭됩니다. 이는 가변성을 다루기 위해 추가 참조가 필요한 경우 등에 중요합니다.
예:
let x = 5; match x { ref r => println!("ref: {}", r), // r: &i32 }
Option<&T>에서 패턴 매칭 중에 가변 참조를 사용하면 어떻게 됩니까?
자동 역참조는 가변 참조와 함께 작동합니다. Option<&mut T>가 있는 경우, match를 통해 가변 변수를 직접 얻을 수 있습니다.
예:
let mut x = 5; let opt = Some(&mut x); match opt { Some(val) => *val += 1, None => {} }
match ergonomics가 예상치 못한 차용 또는 소유권 오류를 초래할 수 있나요?
그럴 수 있습니다. 매치 내부에서 임시 차용이 생성된다는 사실을 인식하지 못하면, 이것이 매칭의 전체 분기를 차단하고 해당 값으로 다른 작업을 차단할 수 있습니다.
* 및 ref를 사용하는 것, 이는 코드의 간결성과 명료성을 떨어뜨립니다.초보자는 여전히 오래된 스타일 Some(&val) 또는 Some(ref val)를 사용하여 Rust를 새 버전으로 업데이트할 때 오류나 예측할 수 없는 동작을 경험합니다.
장점: 코드는 Rust의 초기 버전에서 작동하며, match ergonomics가 등장하기 전 학습한 사람들에게는 이해할 수 있습니다.
단점: 낮은 표현력, 컴파일러 업데이트 후 오류가 발생할 위험.
프로그래머는 현대의 match ergonomics를 사용하여 코드가 간결하고 자동 역참조를 효과적으로 활용합니다.
장점: 간결함, 읽기 쉬움, 참조 수준에서 실수할 위험 감소.
단점: 구 버전의 Rust에서는 이 코드가 작동하지 않을 수 있으며, 현대의 관용구에 익숙하지 않은 사람에게 혼란을 초래할 수 있습니다.