crossinline: Allowing return
You might have funky code that tries doing a return from inside of a lambda expression:
fun beUseful(whenDone: () -> Unit) {
// TODO something useful
whenDone()
}
fun main() {
beUseful {
println("hello, world!")
return
}
println("...and we're done!")
}
This fails to compile:
'return' is not allowed here
You cannot return from the middle of some lambda expression.
However, if you mark the function as inline:
inline fun beUseful(whenDone: () -> Unit) {
// TODO something useful
whenDone()
}
fun main() {
beUseful {
println("hello, world!")
return
}
println("...and we're done!")
}
The code compiles… but ...and we're done! does not get printed. Effectively, what the inline keyword does is turn that code into:
fun main() {
println("hello, world!")
return
println("...and we're done!")
}
As a result, we return from main() before we reach the second println() call.
If you want to block this sort of return from being used, add crossinline to the function type parameter declaration:
inline fun beUseful(crossinline whenDone: () -> Unit) {
// TODO something useful
whenDone()
}
fun main() {
beUseful {
println("hello, world!")
return
}
println("...and we're done!")
}
Now, we are back to the original 'return' is not allowed here compiler error.
Prev Table of Contents Next
This book is licensed under the Creative Commons Attribution-ShareAlike 4.0 International license.