[RUST] 러스트 프로그래밍 공식 가이드(제2판) 18장 요약
패턴과 매칭
패턴이 사용될 수 있는 모든 곳
match 갈래
- match는 값을 여러 패턴에 대응(match) 시켜 각각의 경우에 맞는 코드를 실행하는 제어 흐름 표현식
if let 조건 표현식
- if let은 단일 패턴과 값이 일치할 때만 코드를 실행하는 match의 축약형
while let 조건 루프
- while let은 값이 특정 패턴과 계속 일치하는 동안 반복을 수행하는 루프
for 루프
- for 루프의 왼쪽은단순한 변수명이 아니라 패턴으로 취급되어, 이터레이터가 반환하는 각 값을 그 패턴에 매칭해 내부 구성요소를 자동으로 분해하고 해당 부분들을 변수로 바인딩해 루프 본문에서 바로 사용
let 구문
- let PATTERN = EXPRESSION; 와 같이 표현식을 패턴과 비교하여 찾은 이름을 할당함
함수 매개변수
- 함수 인자 자리에서도 패턴을 사용할 수 있어, 전달된 값을 함수 선언 시점에서 바로 구조 분해할 수 있음
반박 가능성: 패턴이 매칭에 실패할지의 여부
패턴의 두 가지 형태
- 반박 불가능한(irrefutable) 패턴 : 넘겨진 모든 가능한 값에 대해 매칭되는 패턴
- 반박 가능(refutable) 패턴 : 일부 가능한 값에 대해 매칭에 실패 할 수 있는 패턴
if let과while let은 패턴 매칭이 실패할 수도 있는 경우를 처리하기 위한 문법이므로, 반박 불가능한 패턴을 사용하면 컴파일러가 경고를 발생시킴let구문이나 함수 매개변수처럼 항상 값이 존재한다고 가정하는 문맥에서는 패턴이 반드시 반박 불가능해야 하며, 반박 가능한 패턴을 사용하려 하면 컴파일 오류가 발생
패턴이 유효한 모든 문법
리터럴 매칭
- 패턴과 리터럴을 직접 매칭시킬 수 있음
- 코드에서 특정한 구체적인 값을 가질 때 어떤 동작을 수행하려는 경우에 유용
명명된 변수 매칭
- 명명된 변수는 어떤 값과도 매칭되는 반박 불가능한 패턴
- match는 새로운 스코프를 시작하기 때문에, match 표현식 내부에서 패턴의 일부로서 선언된 변수는 모든 변수의 경우와 마찬가지로 match 구조 외부에 있는 같은 이름의 변수를 가리게 됨
다중 패턴
- match 표현식에서는 패턴에 대한 또는(
or) 연산자인|문법을 사용하여 여러 패턴을 매칭시킬 수 있음 - match 문의 갈래에서
1 | 2 => println!("one or tow")와 같이 사용하며 갈래의 값 중 하나와 일치하면 해당 갈래의 코드가 실행됨
..=을 이용한 값의 범위 매칭
..=문법은 경계 값을 포함하는 범위(range)와 매칭시키도록 해줌- match 문의 갈래에서
1 ..=5 => println!("one through five")와 같이 사용하며 1,2,3,4,5 중 하나라면 해당 갈래의 코드가 실행됨 - 컴파일러는 컴파일 타임에 범위가 비어 있지 않은지 확인하며, 러스트가 범위가 비어 있는지를 알 수 있는 유일한 타입은 char와 숫자이므로, 범위는 숫자 또는 char 값으로만 허용됨
값을 해체하여 분리하기
구조체 해체하기
- 구조체의 각 필드를 별도의 변수로 분리해 사용할 수 있음
- 구조체 해체는 구조체 내부 데이터를 부분적으로 꺼내거나 특정 조건을 검사하기 위한 패턴 매칭 도구
열거형 해체
- match 표현식에서 variant에 따라 내부 데이터를 분리하거나 조건적으로 처리할 수 있음
- 데이터가 없는 variant는 단순히 존재 여부로만 매칭되고, 구조체형 또는 튜플형 variant는 그 내부 값들을 해체할 수 있음
중첩된 구조체와 열거형 해체하기
- 구조체 안에 열거형이 있거나, 열거형 안에 구조체가 있는 등 중첩된 형태도 해체할 수 있음
구조체와 튜플 해체하기
- 구조체와 튜플이 섞여 있어도 패턴 조합을 통해 동시에 해체가 가능함
패턴에서 값 무시하기
_로 값 전체 무시하기
- 기존에 match 표현식의 마지막 갈래에서 밑줄을 모든 값과 일치하지만 값에 바인딩되지 않는 와일드 카드 패턴으로 사용했었는데 이는 함수 매개변수를 포함한 모든 패턴에 사용할 수도 있음
중첩된 _로 값의 일부 무시하기
- 다른 패턴 내에서
_을 사용하여 값의 일부만 무시할 수도 있음 - 전체 구조는 매칭해야 하지만 특정 필드나 요소는 필요 없을 때 사용
_로 시작하는 이름으로 사용하지 않는 변수 무시하기
- 변수 이름을 밑줄로 시작하는 것으로 사용하지 않는 변수에 대해 경고하지 않도록 러스트에게 지시할 수 있음
- 프로토타이핑 중이거나 프로젝트를 막 시작할때와 같이, 아직 사용하지 않을 변수를 생성하는 것이 유용할 때도 있음
..으로 값의 나머지 부분 무시하기
..패턴은 나머지 패턴에서 명시적으로 매칭시키지 않은 값의 모든 부분을 무시함..문법을 사용하여 특정 부분만 사용하고 나머지는 무시할 수 있으므로 무시된 각 값에 밑줄을 나열할 필요가 없음..이 어떤 값을 매칭시키고 어떤 값을 무시해야 하는지 불분명하다면, 러스트는 에러를 발생시킴
매치 가드를 사용한 추가 조건
- 매치 가드는 match 갈래의 패턴 뒤에 지정되는 추가 if 조건으로, 해당 갈래가 선택되려면 이 조건도 매칭되어야 함
- 매치 가드에 OR 연산자 (
|) 를 사용하여 여러 패턴을 지정할 수 있으며, 매치 가드 조건은 모든 패턴에 적용됨 - 매치 가드는 패턴만 가지고는 할 수 없는 더 복잡한 아이디어를 표현할 때 유용
- 단점으로는 매치 가드 표현식이 포함되면 컴파일러가 철저성(exhaustiveness)을 확인하려고 하지 않음
@ 바인딩
- at 연산자
@을 사용하면 값에 대한 패턴 매칭 여부를 테스트하는 동시에 해당 값을 갖는 변수를 만들 수 있음
This post is licensed under CC BY 4.0 by the author.