Kotlin 面试题
目录

Kotlin 中 inline, noinline, crossinline 关键字的作用是什么?

· 约 3 分钟读完 · 第 58 / 200 章

推荐答案

在 Kotlin 中,inline、noinline 和 crossinline 是用于控制高阶函数中 lambda 表达式行为的修饰符。

  • inline: 用于修饰高阶函数,表示将函数体直接内联到调用处,从而减少函数调用的开销。内联函数中的 lambda 表达式也会被内联到调用处。

  • noinline: 用于修饰高阶函数中的 lambda 参数,表示该 lambda 表达式不会被内联。通常用于需要将 lambda 表达式作为对象传递的场景。

  • crossinline: 用于修饰高阶函数中的 lambda 参数,表示该 lambda 表达式不能使用非局部返回(即不能使用 return 语句返回到外层函数)。通常用于确保 lambda 表达式在特定上下文中执行。

本题详细解读

inline

inline 关键字用于修饰高阶函数,表示该函数在编译时会被内联到调用处。内联函数的主要优点是减少了函数调用的开销,尤其是在频繁调用的小函数中。此外,内联函数中的 lambda 表达式也会被内联到调用处,从而避免了 lambda 表达式的额外对象分配。

在上面的例子中,inlineFunction 函数会被内联到 main 函数中,block lambda 表达式也会被内联。

noinline

noinline 关键字用于修饰高阶函数中的 lambda 参数,表示该 lambda 表达式不会被内联。这在需要将 lambda 表达式作为对象传递时非常有用。

在上面的例子中,block 参数被标记为 noinline,因此它不会被内联,而 block2 会被内联。

crossinline

crossinline 关键字用于修饰高阶函数中的 lambda 参数,表示该 lambda 表达式不能使用非局部返回。这在确保 lambda 表达式在特定上下文中执行时非常有用。

在上面的例子中,block 参数被标记为 crossinline,因此它不能使用 return 语句返回到外层函数。