본문 바로가기
Kotlin

return label(block)

by 루에 2019. 5. 23.
반응형

코틀린의 모든 블록은 라벨 설정이 가능하다.

그래서 return할 때 반환할 블록을 임의로 설정하여 여러가지 효과를 나타낼 수 있다.

 

case 1) 일반적인 return. 3을 만나면 forEach를 종료한다.

fun foo() { 
    listOf(1, 2, 3, 4, 5).forEach { 
        if (it == 3) return // non-local return directly to the caller of foo() 
        print(it) 
    } 
    println("this point is unreachable") 
}

결과값
12this point is unreachable

 

case 2) forEach에 람다를 적용한다. 블록에 라벨을 설정하여 해당 블록만 반환하도록 변경. 3을 제외하고 다 출력

fun foo() {
    listOf(1, 2, 3, 4, 5).forEach lit@{
        if (it == 3) return@lit // local return to the caller of the lambda, i.e. the forEach loop
        print(it)
    }
    print(" done with explicit label")
}

결과
1245 done with explicit label

 

case 3) forEach도 일종의 라벨이다. 따로 라벨 지정하지 않고 바로 forEach를 반환하도록 설정

fun foo() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return@forEach // local return to the caller of the lambda, i.e. the forEach loop
        print(it)
    }
    print(" done with implicit label")
}

>>
1245 done with implicit label

 

case 4) run은 익명함수처럼 쓸 수 있다. 결과적으로는 case1과 같은 효과를 내지만 명시적으로 아래와 같이 지정 가능. 물론 run 뒤에 라벨을 설정하여 쓸 수도 있다.

fun foo() {
    run {
    listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
        if (value == 3) return@run  // local return to the caller of the anonymous fun, i.e. the forEach loop
        print(value)
    })
    }
    print(" done with anonymous function")
}

>>
12 done with anonymous function

 

 

반응형

댓글