与其说是“取消”内联 lambda 的资格,不如说是“不能对内联的 lambda 执行此操作。”
我有点回答了这个here。
内联方法直接插入到调用站点,任何内联 lambda 也是如此。
要重用我的旧示例,
这大致导致main在这里:
fun withLambda(lambda: () -> Unit) {
lambda()
}
inline fun inlinedLambda(lambda: () -> Unit) {
lambda()
}
fun main(args: Array<String>) {
withLambda { println("Hello, world") }
inlinedLambda { println("Hello, world") }
}
被转换成这个:
fun main(args: Array<String>) {
withLambda { println("Hello, world") }
println("Hello, world") // <- Directly inserted!
}
您不能对内联 lambda 做的是将其视为对象。
这意味着您不能将其存储在字段中:
val a = lambda // <-- error
或在其上调用方法:
lambda.toString() // <-- error
因为它不是一个对象。
它也不能作为参数传递给另一个函数
func(lambda) // <-- error
除非 lambda 被标记为crossinline,而另一个函数的参数是inline。
这基本上由文档说明。
noinline 可以以我们喜欢的任何方式进行操作:存储在字段中、传递等等。
请注意,某些内联函数可能会调用作为参数传递给它们的 lambdas ... 为了表明这一点,需要使用 crossinline 修饰符标记 lambda 参数:
将内联 lambda 视为将它们的 代码 直接插入到方法中。从概念上讲,它们实际上并不存在,“调用”它们只会将它们的内容插入到调用方法中。