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 反馈 — 无需本地设置。