Kotlin内联函数中return@inlined为何未终止函数执行?
问题解析:inline函数里return@inlined为何不终止整个函数?
先看符合你描述输入输出的典型代码示例:
inline fun inlined(block: () -> Unit) { print("5") block() print("hi!") print("6") } fun main() { inlined { return@inlined } }
核心逻辑:限定返回的作用域边界
return@inlined是限定作用域的返回,它只负责跳出当前的lambda表达式block,不会影响外层inlined()函数的执行流程。因为inline函数的lambda会被直接内联到调用处,这段代码相当于在main里展开成:print("5") // 原lambda代码块,执行return@inlined即跳出这个块 print("hi!") print("6")所以跳出lambda后,
inlined()里后续的print("hi!")和print("6")会正常执行,最终输出5hi!6。如果你想得到预期的
56,有两种可行方式:- 使用裸return:inline函数的lambda允许裸return,它会直接返回外层的调用函数(这里就是
main),inlined()里block之后的代码全部终止:fun main() { inlined { return } } // 输出:5 - 让lambda返回终止标记,在inline函数内判断后终止:
inline fun inlined(block: () -> Boolean) { print("5") if (block()) { print("6") return } print("hi!") print("6") } fun main() { inlined { return@inlined true } } // 输出:56
- 使用裸return:inline函数的lambda允许裸return,它会直接返回外层的调用函数(这里就是
关于return@block的本质
你提到的return@block和return@inlined逻辑完全一致——都是限定返回对应的lambda作用域,不会终止外层函数。区别仅在于标签名:如果你的lambda参数名是block,return@block就是返回这个lambda;用return@inlined则是返回标记为inlined的作用域(这里刚好是inline函数的名称)。
总结:带标签的return(return@xxx)只会跳出标签对应的代码块/作用域,而非整个外层函数。只有裸return在inline函数的lambda中,才会直接终止外层的调用函数。
内容的提问来源于stack exchange,提问作者Oleksii Kolotylenko
相关产品推荐
相关产品推荐

