内联方法
Scala 3 的 inline
内联方法 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
什么是 inline?
Scala 3 中的 inline 关键字会指示编译器在编译期间将定义展开到调用位置。它是进入元编程的入口,位于完整宏之前。
内联方法
将方法标记为 inline 后,其方法体会在每个调用位置被替换。这样可以消除调用开销,并支持编译期特化。
inline def square(x: Int): Int = x * x
val r = square(5) // compiles to 5 * 5内联参数
inline 参数会强制将其参数也进行内联。如果参数是常量,编译器可以将其折叠为字面量。
inline def power(x: Int, inline n: Int): Int =
if (n == 0) 1 else x * power(x, n - 1)常量折叠
当内联参数是字面量时,分支和递归可以在编译期完全解析,字节码中只保留最终表达式。
inline def power(x: Int, inline n: Int): Int =
if (n == 0) 1 else x * power(x, n - 1)
val c = power(2, 3) // expands to 2 * 2 * 2 * 1inline if 与 inline match
在内联方法中,当匹配对象在静态上已知时,inline if 和 inline match 会在编译期解析,从而消除无效分支。
inline def label(inline b: Boolean): String =
inline if (b) "yes" else "no"透明内联
transparent inline 允许根据调用位置细化方法的返回类型,因此编译器可能推断出比声明类型更具体的类型。
transparent inline def first(inline b: Boolean): Any =
inline if (b) 1 else "x" // type can be Int or Stringcompiletime.error
scala.compiletime 包提供了 error 等工具,可以使用自定义消息使编译失败,适合验证内联参数。
import scala.compiletime.error
inline def positive(inline n: Int): Int =
inline if (n <= 0) error("n must be positive") else n内联值
inline val 是真正的编译期常量。需要字面量的地方都可以使用它,例如其他内联计算中。
inline val MaxRetries = 3
inline def retries: Int = MaxRetries性能与代码大小
内联以代码大小换取速度和编译期保证。对大型方法体过度使用内联会使字节码膨胀,因此应将其保留给小型、热点或特化要求较高的方法。
不使用 Inline 也能运行
下面是相同平方计算逻辑的普通自包含程序。内联版本会在调用位置展开乘法,因此产生相同的结果。
object Main {
def square(x: Int): Int = x * x
def main(args: Array[String]): Unit = {
println(square(5)) // 25
}
}Inline 是基础
宏建立在内联方法之上:内联定义可以调用宏来生成代码。先掌握 inline,会让宏这一层容易得多。
快速检查
在内联方法中添加 transparent 会带来什么变化?
回顾
您学习了 Scala 3 的内联:
inline def会在调用位置展开inline参数和常量折叠inline if/inline matchtransparent inline、inline val、compiletime.error
下一节:宏基础。
常见问题解答
「内联方法」课时是免费的吗?
是的 — 「内联方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
「内联方法」这节课中我会学到什么?
Scala 3 的 inline 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「内联方法」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?
能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。