더 이상 권장되지 않음: 비지역 반환
더 이상 권장되지 않음: 비지역 반환 (Nonlocal Returns)
중첩된 익명 함수에서 반환하는 것(비지역 반환)은 Scala 3.2.0부터 더 이상 권장되지 않아요(deprecated). 이 패턴이 왜 문제인지 살펴보고, 더 나은 대안을 함께 보도록 할게요.
본문
중첩된 익명 함수에서 반환하는 것은 Scala 3.2.0부터 더 이상 권장되지 않아요.
비지역 반환은 scala.runtime.NonLocalReturnException을 던지고 잡는 방식으로 구현돼요. 그런데 이건 프로그래머가 의도한 동작인 경우가 드물어요. 예외를 던지고 잡는 데 숨겨진 성능 비용이 있다는 점도 문제예요. 게다가 구현 방식이 새어 나가는(leaky) 성격이라, 모든 예외를 잡는(catch-all) 핸들러가 NonLocalReturnException을 가로챌 수도 있어요.
비지역 반환뿐 아니라 scala.util.control.Breaks API 대신 쓸 수 있는 더 나은 대안은 scala.util.boundary와 boundary.break예요.
예시:
import scala.util.boundary, boundary.break
def firstIndex[T](xs: List[T], elem: T): Int =
boundary:
for (x, i) <- xs.zipWithIndex do
if x == elem then break(i)
-1