isMatch
깊은 부분 일치 검사입니다. target이 pattern이 기술한 내용을 모두 담고 있습니까?
bool isMatch(Object? target, Object? pattern)
강의
isMatch는 pattern을 재귀적으로 훑으면서
target이 그것을 "담고 있는지" 확인합니다. 규칙은 모양에 따라 다릅니다.
Map은 부분 일치입니다. pattern의 모든 키가
target에 존재하고 그 값도 재귀적으로 일치해야 하지만,
target에는 패턴이 언급하지 않은 추가 키가 있어도
괜찮습니다. 리스트나 이터러블은 앞에서부터 짝을 지어
비교하는데, 여기에 기억해 둘 만한 반전이 있습니다. 패턴은 타깃의
접두사이기만 하면 됩니다. [1, 2, 3]은
패턴 [1, 2]와는 일치하지만 결코 패턴
[1, 2, 3, 4]와는 일치하지 않습니다. 패턴이 타깃보다 길 수는 없습니다.
그 밖의 값(숫자, 문자열, 불리언 …)은 그냥 ==로 비교합니다.
규칙이 중첩되기 때문에 깊은 일치 검사는 거의 거저 얻습니다.
{'address': {'city': 'seoul'}} 같은 패턴은, 훨씬 크고 깊게
중첩된 address 값을 가진 사용자 map이라도 그 안 어딘가에
city가 'seoul'이기만 하면 일치합니다.
데모 1 · Map 일치
데모 2 · 리스트 접두사 일치, 그리고 그것으로 필터링하기
직접 해 보기
연습: isMatch로 order가 {'status': 'shipped'}와 일치하는지 확인해 보세요.