missing_variable_pattern 진단 — logical-or 패턴 한쪽에 변수가 빠졌어요
missing_variable_pattern 진단 — logical-or 패턴 한쪽에 변수가 빠졌어요
Dart 분석기가 내보내는 missing_variable_pattern 진단은 logical-or 패턴(||로 연결한 패턴)에서 한쪽 분기에는 선언된 변수가 다른 쪽 분기에는 없을 때 발생해요.
본문
이 진단은 언제 발생해요?
analyzer는 logical-or 패턴의 한 분기가, 같은 패턴의 다른 분기에 선언된 변수를 선언하지 않았을 때 이 진단을 내보내요. 조건이 "이거 아니면 저거"인데, 한쪽에서만 a라는 변수를 만들면 그 변수를 언제 쓸 수 있는지 애매해지니까요.
예시를 볼까요?
아래 코드에서 logical-or 패턴의 왼쪽((var a, 0))에는 변수 a가 선언되어 있는데, 오른쪽((0, _))에는 없어서 이 진단이 발생해요.
void f((int, int) r) {
if (r case (var a, 0) || (0, _)) {
print(a);
}
}
어떻게 고치면 돼요?
상황에 따라 세 가지 방법 중 하나를 고를 수 있어요.
① 변수를 제어 구문에서 실제로 참조할 필요가 있을 때는 logical-or 패턴의 모든 분기에 그 변수를 선언해 주면 돼요.
void f((int, int) r) {
if (r case (var a, 0) || (0, var a)) {
print(a);
}
}
② 변수를 제어 구문에서 참조하지 않아도 될 때는 모든 분기에서 그 변수의 선언을 빼면 돼요.
void f((int, int) r) {
if (r case (_, 0) || (0, _)) {
print('found a zero');
}
}
③ 변수가 어느 한쪽 분기가 매칭될 때만 필요하고, 다른 쪽이 매칭될 때는 필요 없을 때는 패턴을 두 조각으로 나누는 게 깔끔해요.
void f((int, int) r) {
switch (r) {
case (var a, 0):
print(a);
case (0, _):
print('found a zero');
}
}
무엇을 기준으로 고르면 돼요?
핵심은 "변수를 매칭된 뒤의 코드에서 쓰는지, 언제 쓰는지"예요. 모든 분기에서 똑같이 쓴다면 ①처럼 양쪽에 선언하고, 아예 안 쓴다면 ②처럼 지우고, 한쪽에서만 쓴다면 ③처럼 나눠주는 흐름이 자연스러워요.
더 알아보기
- logical-or 패턴을 포함한 패턴 매칭 문법은 Patterns 문서에서 자세히 볼 수 있어요.
- Dart 분석기 진단 전체 목록은 Diagnostics 문서를 참고해 보세요.