제너레이터 함수에서는 값을 반환할 수 없어요
제너레이터 함수에서는 값을 반환할 수 없어요
return_in_generator 진단은 async*나 sync*로 만든 제너레이터(generator) 함수가 return으로 값을 돌려주려 할 때 알려주는 경고예요. 제너레이터에서는 값을 내보낼 때 yield를 써야 해요.
출처: Can't return a value from a generator function that uses the 'async*' or 'sync*' modifier
본문
Dart 분석기는 본문이 async* 또는 sync*로 표시된 제너레이터 함수가 두 가지 방식 중 하나로 값을 반환하려 할 때 이 진단을 만들어요.
return문을 써서 값을 반환하는 경우=>를 써서 값을 암시적으로 반환하는 경우
이런 경우에는 return 대신 yield를 사용해야 해요.
예시
아래 코드는 메서드 f가 제너레이터인데 return으로 값을 반환하려 해서 이 진단이 발생해요.
Iterable<int> f() sync* {
return 3;
}
아래 코드는 함수 f가 제너레이터인데 값을 암시적으로 반환해서 이 진단이 발생해요.
Stream<int> f() async* => 3;
흔한 해결 방법
함수 본문에 =>를 쓰고 있다면, 블록 함수 본문으로 바꾸고 yield로 값을 내보내면 돼요.
Stream<int> f() async* {
yield 3;
}
메서드가 제너레이터가 되길 원하는 거라면, yield로 값을 내보내면 돼요.
Iterable<int> f() sync* {
yield 3;
}
메서드가 제너레이터가 되길 원하지 않는다면, 본문에서 제너레이터 수식어를 제거하면 돼요. Future를 반환하는 경우에는 async를 쓰면 되고요.
int f() {
return 3;
}
더 알아보기
- Dart 분석기 진단 전체 목록 살펴보기: Dart diagnostics
- 제너레이터와
yield사용법 자세히 보기: Dart 함수 문서