label_in_outer_scope 진단: 바깥 메서드에 선언된 라벨 참조

label_in_outer_scope 진단: 바깥 메서드에 선언된 라벨 참조

Dart 분석기가 만들어 내는 label_in_outer_scope 진단에 대해 설명해요.

출처: label_in_outer_scope

본문

바깥 메서드에 선언된 라벨 {0}은(는) 참조할 수 없어요.

설명

분석기는 break 또는 continue 문이 그 문이 나타나는 함수를 포함하는 메서드나 함수에 선언된 라벨을 참조할 때 이 진단을 만들어요. breakcontinue 문은 그들을 포함하는 함수의 바깥으로 제어 흐름을 옮기는 데 사용할 수 없어요.

예시

다음 코드는 라벨 loop이 지역 함수 g의 바깥에 선언되어 있기 때문에 이 진단을 만들어요.

void f() {
  loop:
  while (true) {
    void g() {
      break loop;
    }

    g();
  }
}

흔한 해결 방법

지역 함수의 바깥으로 제어 흐름을 옮기지 않아도 되도록, 아마도 지역 함수를 인라인해서 코드를 다시 작성해 봐요.

void f() {
  loop:
  while (true) {
    break loop;
  }
}

그게 불가능하다면, 함수가 반환하는 값을 사용해 제어 흐름을 옮길지 결정하도록 지역 함수를 다시 작성해 봐요.

void f() {
  loop:
  while (true) {
    bool g() {
      return true;
    }

    if (g()) {
      break loop;
    }
  }
}

더 알아보기