Kotlin学习系列之:inline、noinline和crossinline

x33g5p2x  于2022-03-08 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(510)
  1. inline:我们在之前已经对其做了专题描述,具体可参阅 Kotlin学习系列之:inline
  2. noinline.

当我们的内联函数中有多个lambda参数时,如果我们想要其中某一个lambda参数不进行内联,则可以使用noinline关键字。

fun main() {
   myMethod(former = {
       println("former")
   }, latter = {
       println("latter")
   })
}

private inline fun myMethod(former: () -> Unit, latter: () -> Unit) {
   former()
   latter()
}

运行结果我就不展示了,直接贴出它的反编译代码:

fun main() {
   myMethod(former = {
       println("former")
   }, latter = {
       println("latter")
   })
}

private inline fun myMethod(former: () -> Unit, noinline latter: () -> Unit) {
   former()
   latter()
}

对latter参数我们使用noinline关键字,再看反编译结果:

很明显,字节码层面已经发生了变化,也就意味着noinline关键字起了作用。

  1. crossinline.

在inline关键字篇中,我们阐述了在使用inline函数时,有一个注意点:小心地使用流程跳转。我们这里再把那部分示例代码贴出来:

fun main() {
   println("start execution:")
   sayHello {
       println("in lambda")
       return
   }
   println("end execution")
}

private inline fun sayHello(block: () -> Unit) {
   println("in sayHello")
   block()
}

输出结果为:

start execution:

in sayHello

in lambda

可以看出,最后的"end execution"并没有输出在控制台,那是因为程序在执行sayHello时,由于inline函数,导致return语句直接结束了main方法。我们如果想在sayHello定义时,就不想以后出现这样的使用隐患,就可以使用crossinline关键字:

在加上了crossinline关键字之后,return语句那块就已经显示语法错误了。

实际上这里的return语句在Kotlin有一个专门的术语,叫做:“non-local returns”,非局部返回。使用crossinline关键字就是为了避免非局部返回。

  1. 总结:可以看出,理解这三个关键字,最主要还是要理解inline关键字,noinline、crossinline都是为了在使用inline时处理一些特殊情况的。

相关文章