0Pricing
Scala for Backend Engineering & Functional Programming · 课时

内联方法

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 * 1

inline 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 String

compiletime.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 match
  • transparent 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 内联方法
  2. 宏基础
  3. 引号与拼接
  4. 实用宏
← 返回 Scala for Backend Engineering & Functional Programming