[Rust] 패턴매칭과 패턴

러스트는 match 키워드를 통해 패턴매칭을 제공한다.
용어 그대로, 패턴과 패턴에 대응하는 제어구문을 매칭해준다.
패턴 => 구문,

러스트의 패턴매칭은 아주 정교하고 편리한 표현을 사용할 수 있게 해주는데,
일단 가장 기본적인 패턴은 그냥 값을 때려박는 것이다. 값도 패턴이다. image

image _는 와일드카드 패턴이다. 뭐든 대응된다.


옵션 Some 바인딩
옵션값도 이러한 방식으로 받아와 바인딩할 수 있다. image

image 저러면 옵션이 Some일때만 그 값을 val에 바인딩해서 해당 구문을 수행한다.

위에선 새로운 변수명을 썼지만, 값을 넣어서 비교시킬 수도 있다. image

image


패턴 가드
그냥 패턴 오른쪽에 if 달아서 추가조건을 부여하는 것이다. image

image


범위 표현
수의 범위는 A...B 나 A..=B의 형태를 통해 표현한다. A부터 B까지의 수를 대응시키는 것이다. image

image

image 둘다 똑같이 도는 것 같은데... 뭔 차인진 모르겠다.


튜플
튜플값도 손쉽게 표현이 가능하다. 튜플 개별 요소에 와일드카드를 박을 수도 있다. image

image


패턴 병합
한 구문에 여러개의 패턴을 매칭시키려면 |를 쓰면 된다. image

image 여기선 값 패턴만 넣었지만, 더 복잡한 응용도 가능하다.


구조체 응용
패턴에는 모든 타입의 값이 들어갈 수 있고, 구조체도 마찬가지다.
좌표값을 나타내는 간단한 구조체 Point를 정의하고 패턴값에 적용해보겠다.
그냥 구조체 생성 표현식을 때려박으면 된다. image

image 여기에서도 와일드카드 '_' 적용이 가능하다는 것을 알 수 있다.

근데 저기서 와일드카드 처리된 멤버변수를 바로 사용하고 싶다면? 와일드카드 대신에 그 멤버변수 이름만 적어주면 된다. image

image


광역 와일드카드? '..'
기존의 와일드카드 _는 요소 하나에 대해서만 모든 값을 대응시켰다. 하지만 ..는 요소 표현 부분에 붙어서 나머지를 죄다 퉁칠 수 있게 해준다.
구조체의 경우, ..는 요소 표현 맨 오른쪽에 와야 한다. image

image

구조체뿐만 아니라 튜플도 된다.
구조체와는 달리 ..가 중간이나 왼쪽에 들어갈 수 있다. image

image


타입 패턴
패턴에는 값뿐만 아니라 타입도 올 수 있다... image

image 위의 코드는 무조건 i32니까 별 의미는 없지만, trait을 응용하면 의미있는 코드가 나올 수도 있겠다. 그래도 여전히 별 쓸모는 없겠다.

이 표현법에 대한 실질적인 사용 가치는 열거체에 있다. 열거체의 멤버 각각은 하나의 타입과 같이 표현되므로.. image

image

구조체 용법을 응용하면 이렇게도 된다. image

image


바인딩 연산자 @
이건 해당 패턴의 값을 지정한 변수명에 바인딩하는 연산자다.
변수명 @ 패턴

간단하게는 이렇게 해서 image

image

이런 식의 복잡해보이는 중첩까지 가능하다. image

image



참조
https://cheats.rs/#pattern-matching
https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html