[Rust] 패턴매칭과 패턴
러스트는 match 키워드를 통해 패턴매칭을 제공한다.
용어 그대로, 패턴과 패턴에 대응하는 제어구문을 매칭해준다.
패턴 => 구문,
러스트의 패턴매칭은 아주 정교하고 편리한 표현을 사용할 수 있게 해주는데,
일단 가장 기본적인 패턴은 그냥 값을 때려박는 것이다. 값도 패턴이다.

_는 와일드카드 패턴이다. 뭐든 대응된다.
옵션 Some 바인딩
옵션값도 이러한 방식으로 받아와 바인딩할 수 있다.

저러면 옵션이 Some일때만 그 값을 val에 바인딩해서 해당 구문을 수행한다.
위에선 새로운 변수명을 썼지만, 값을 넣어서 비교시킬 수도 있다.


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


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


둘다 똑같이 도는 것 같은데... 뭔 차인진 모르겠다.
튜플
튜플값도 손쉽게 표현이 가능하다. 튜플 개별 요소에 와일드카드를 박을 수도 있다.


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

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

여기에서도 와일드카드 '_' 적용이 가능하다는 것을 알 수 있다.
근데 저기서 와일드카드 처리된 멤버변수를 바로 사용하고 싶다면? 와일드카드 대신에 그 멤버변수 이름만 적어주면 된다.


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


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


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

위의 코드는 무조건 i32니까 별 의미는 없지만, trait을 응용하면 의미있는 코드가 나올 수도 있겠다. 그래도 여전히 별 쓸모는 없겠다.
이 표현법에 대한 실질적인 사용 가치는 열거체에 있다. 열거체의 멤버 각각은 하나의 타입과 같이 표현되므로..


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


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


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


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