为什么我们在 kotlin 中需要 noinline?

Why we need noinline in kotlin?

我正在阅读 kotlin 文档但无法理解一件事。

我们可以使用 noinline 修饰符来标记 lambda 不应该是 inline。但是当我们真正需要它的时候,真实情况是怎样的呢?

我明白 noinline 的作用,但不明白为什么。

注意,当 inline 添加到 function/method 声明时,所有 的 lambda 参数都被内联。

另请注意,您可以通过某些方式使用 lambda 参数,这需要不内联 lambda。例如,将其传递给另一个 non-inlined 函数,或将其分配给变量:

var func: (() -> Unit)? = null
inline fun foo(x: () -> Unit, y: () -> Unit) {
    notInlined(x) // x must be not inlined for this to work
    func = x // x must be not inlined for this to work
}

那么如果我想做notInlined(x),但我仍然想内联y怎么办?这是我使用 noinline:

的地方
inline fun foo(noinline x: () -> Unit, y: () -> Unit)

IntelliJ 甚至给出了这个建议:

我注意到的一件事是,例如,这是允许的,但是那时永远不会达到“runLambda 结束”。

fun main() {
    runLambda {
        println("lambda")
        return
    }

}

inline fun runLambda(lambda: ()->Unit) {
    lambda.invoke()
    println("end of runLambda")
}

如果你想确保函数完全运行到最后 noinline 可以修复它,因为那样它就不允许 return

虽然 crossinline 可以做同样的事情,但我认为它实际上就是为此而设计的。我不确定有什么区别