STUDY/Rust

Rust - 22. 패턴과 매칭

sinawi95 2024. 3. 26. 21:07
728x90

열거형할때 간단히 링크 남기고 넘어갔던 패턴에 관한 내용이다.


1. 패턴

타입의 구조와 매칭을 위한 문법

  • 패턴에 매치되면 그다음 코드를 실행함

패턴은 아래를 조합해서 구성함

  • 리터럴 값 (literals)
  • 분해한 배열(destructured array), 열거형, 구조체, 튜플
  • 변수
  • 와일드카드 (wildcard)
  • 자리표시자 (placeholder)

match

match VALUE {
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
}
  • 이전 게시글에 c의 switch와 비슷하다고 작성했었다.
  • 표현식의 모든 값에 대한 경우의 수를 고려해야한다.
    • 모는 가능성을 포괄하기 위해선 catchall 패턴을 사용할수 있다.
    • `-` 이라는 패턴은 모든 값에 매치될수 있지만 변수에 묶지 않는다. 마지막 매치 갈래에 자주 사용된다.

 if let

fn main() {
    if let condition1 {
        // code1
    } else if condition2 { // else if let 으로 사용하지 않아도 가능
        // code2
    } else if let condition3 {
        // code3
    } else {
        // code4
    }
}
  • match보다 짧게 작성할수 있고 유연하게 사용할수 있다
  • 여러가지 패턴을 같이 비교할수 있다
  • 모든 패턴 값에 대해 들어있는지 확인하지 않으므로 else를 생략하면 논리적 버그가 생길수 있다

while let 조건 루프

    while let condition1 {
        // code
    }
  • 패턴이 매칭 되는 동안 반복 수행된다.

for 루프

for x in y {
    // code
}
  • x가 패턴이다 
  • 아래 let 구문과 같이 생각하면 좋다.

let 구문

// let PATTERN = EXPRESSION;
let x = 1;
let (x,y,z) = (1,2,3);
  • let 구문을 사용할때마다 패턴을 사용한다.
  • 표현식을 패턴과 비교하고 패턴과 매칭되는지 확인한다음 각 변수에 값을 바인딩한다고 보면 된다.

함수 매개변수

fn foo(x: i32) {}
  • for, let 구문과 마찬가지로 x가 패턴이다.

 

2. 반박 가능한 패턴, 반박 불가능한 패턴

반박 가능한 패턴 Refutable patterns

if let Some(x) = a_vlaue {
}
  • 일부 가능한 값에대해 매칭에 실패할수 있는 패턴

반박 불가능한 패턴 Irrefutable patterns

let x = 5;
  • 넘겨진 모든 가능한 값에 대해 매칭되는 패턴

 

일반적으로는 두 패턴을 구분할 필요는 없다.

  • 반박 불가능한 패턴만 가능한 경우가 있다
    • 이때 반박 가능한 패턴을 사용하면 러스트 컴파일러에서 오류를 띄운다
    • 이 경우 패턴을 사용하는 코드로 바꿔서 해결할수 있다. let -> if let
  • 반박 가능한 패턴을 쓰는 곳에 반박 불가능한 패턴을 사용하면 warning을 띄운다.

3. 패턴 문법

(지금은 그냥 보고만 넘어가는데 다음에 다시 보면서 정리하면 코드를 가져오든 비슷한걸로 만들든 하자)

리터럴 매칭

명명된 변수 매칭

다중 패턴 매칭

범위 매칭(다중 패턴 매칭 2)

 

구조체 해체

열거형 해체

중첩된 구조체, 열거형 해체

구조체와 튜플 해체

 

_(underbar) 로 전체 값 무시하기

중첩된 _로 값의 일부 무시하기

_로 시작하는 이름으로 사용하지 않는 변수 무시하기

..으로 값의 나머지 부분 무시하기

 

Match Guard

  • match 갈래의 패턴 뒤에 지정되는 추가 if 조건

@(at) 바인딩

  • 값에 대한 패턴 매칭 여부를 테스트하면서 해당 값을 갖는 변수를 만들 수 있다.

https://doc.rust-kr.org/ch18-00-patterns.html