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

Scala 3 given/using

现代语法

Scala 3 given/using 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。

Scala 3 中的现代隐式机制

Scala 3 使用更清晰的语法替代了含义繁多的 implicit 关键字:given 用于定义隐式值,using 用于声明隐式参数。这样意图更容易理解。

object Main:
  given greeting: String = "Hello"
  def greet(name: String)(using g: String): String = s"$g, $name!"
  def main(args: Array[String]): Unit =
    println(greet("Ann"))

given 替代隐式 val

Scala 2 中的 implicit val x: T = ...,在 Scala 3 中写作 given x: T = ...。它声明了一个可供隐式解析使用的值。

object Main:
  given factor: Int = 10
  def scale(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(scale(5))

using 替代隐式参数

using 子句会将参数列表标记为隐式。编译器会从作用域中匹配的 given 获取并填充它。

object Main:
  given unit: String = "kg"
  def label(n: Int)(using u: String): String = s"$n$u"
  def main(args: Array[String]): Unit =
    println(label(75))

匿名 given

如果您不会直接引用某个 given,可以省略它的名称。编译器仍然会根据类型找到它。

object Main:
  given Int = 3
  def triple(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(triple(7))

使用 summon 召唤值

Scala 3 的 summon[T] 替代了 implicitly[T]。它会直接获取类型为 T 的 given 值。

object Main:
  given name: String = "Scala 3"
  def main(args: Array[String]): Unit =
    val n = summon[String]
    println(n)

匿名 using 参数

如果您只需要转发 using 参数,可以在子句中省略参数名称:(using Int)。在内部使用 summon 召唤它。

object Main:
  given Int = 100
  def boosted(x: Int)(using Int): Int = x + summon[Int]
  def main(args: Array[String]): Unit =
    println(boosted(5))

使用 given 表示类型类

given/using 最符合惯用方式的用途是类型类。定义一个特征,提供一个 given 实例,并通过 using 要求该实例。

trait Show[A]:
  def show(a: A): String

object Main:
  given Show[Int] with
    def show(a: Int): String = s"Int($a)"

  def display[A](a: A)(using s: Show[A]): String = s.show(a)

  def main(args: Array[String]): Unit =
    println(display(42))

上下文界仍然可用

上下文界 [A: Show] 仍然可用,并且会展开为一个 using 参数。结合 summon 即可访问该实例。

trait Show[A]:
  def show(a: A): String

object Main:
  given Show[String] with
    def show(a: String): String = s"Str($a)"

  def display[A: Show](a: A): String = summon[Show[A]].show(a)

  def main(args: Array[String]): Unit =
    println(display("hi"))

显式传入 using 参数

您可以在调用位置使用 using 关键字显式提供 using 参数,从而覆盖作用域中的 given。

object Main:
  given Int = 10
  def scale(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(scale(5))
    println(scale(5)(using 2))

导入 given

Scala 3 提供了专门用于导入 given 的语法:import pkg.given 或 import pkg.{given Show[Int]}。这样可以明确而有意图地导入隐式值。

object Instances:
  given Int = 5

object Main:
  import Instances.given
  def addBase(x: Int)(using b: Int): Int = x + b
  def main(args: Array[String]): Unit =
    println(addBase(10))

为什么采用新语法

在 Scala 2 中,单个关键字 implicit 表示多种不同含义。Scala 3 将其拆分为:given = 提供,using = 要求。代码更清晰,错误也更容易理解。

object Main:
  given pi: Double = 3.14159
  def area(r: Double)(using p: Double): Double = p * r * r
  def main(args: Array[String]): Unit =
    println(area(2.0))

快速检查

在 Scala 3 中,哪些关键字分别替代 implicit,用于提供值和要求值?

回顾

您已经学习了 Scala 3 的 given/using:

  • given 提供隐式值(替代 implicit val)
  • using 声明隐式参数
  • summon[T] 替代 implicitly[T]
  • given 可以是匿名的,非常适合类型类
  • import pkg.given 可以显式导入它们

常见问题解答

「Scala 3 given/using」课时是免费的吗?

是的 — 「Scala 3 given/using」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。

「Scala 3 given/using」这节课中我会学到什么?

现代语法 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「Scala 3 given/using」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?

能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 隐式参数
  2. Scala 3 given/using
  3. 隐式转换
  4. 扩展方法
← 返回 Scala for Backend Engineering & Functional Programming