文章19 | 阅读 9950 | 点赞0
当我们的内联函数中有多个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关键字起了作用。
在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关键字就是为了避免非局部返回。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/xlh1191860939/article/details/105228583
内容来源于网络,如有侵权,请联系作者删除!