missing_variable_pattern 진단 — logical-or 패턴 한쪽에 변수가 빠졌어요

missing_variable_pattern 진단 — logical-or 패턴 한쪽에 변수가 빠졌어요

Dart 분석기가 내보내는 missing_variable_pattern 진단은 logical-or 패턴(||로 연결한 패턴)에서 한쪽 분기에는 선언된 변수가 다른 쪽 분기에는 없을 때 발생해요.

출처: missing_variable_pattern

본문

이 진단은 언제 발생해요?

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 문서를 참고해 보세요.