람다표현식은 non-local return이다. 애초에 람다식이 파라미터로 전달될 때, 해당 람다식에 return을 사용할 수 없다. 하지만 called function이 inline으로 선언되어 있다면 가능하다. 근데 이 때 return을 하게 되면 inline 함수 특성상 해당 함수를 호출하는 것이 아니라 그대로 바이트 코드를 복사해와서 call한 자리에 붙여넣기 때문에 calling function이 return되는 문제가 있다. 이를 해결하기 위해 label@을 붙이거나 return@calledfunction 을 선언해야한다.
반대로 anonymous function은 local return이다. 익명함수에서 리턴하면 anonymous function이 return된다.
fun main(args : Array<String>){
called(fun (): Unit {
println("this if anonymous function")
return
}
)
called() lambda@{
println("this is lambda expresssion")
return@lambda
}
println("main function return")
}
inline fun called(func : () -> Unit){
println("this function is called")
func()
println("this function return")
}
결과
this function is called
this if anonymous function
this function return
this function is called
this is lambda expresssion
this function return
main function return