You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,有两种可行方式:

    1. 使用裸return:inline函数的lambda允许裸return,它会直接返回外层的调用函数(这里就是main),inlined()里block之后的代码全部终止:
      fun main() {
          inlined {
              return
          }
      }
      // 输出:5
      
    2. 让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@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:57:42