gpt4 book ai didi

scala - 给出/使用 Scala 2 隐式和 Scala 3 之间的区别

转载 作者:行者123 更新时间:2023-12-04 12:09:45 24 4
gpt4 key购买 nike

implicit有什么区别Scala 2 和 given 中的关键字+ using在 Scala 3 中?难道只是这样implicit已经拆分成两个关键字,或者语义也不同,如果是这样,如何?

最佳答案

在大多数情况下,它们是相同的。然而,implicit不再用于多个不同的概念。 docs更详细,但这里是它们的摘要:
使用
声明参数时,usingimplicit 相同.但是,当显式传递隐式参数时,您必须使用 using :

def foo(using bar: Bar) = ???
foo(using Bar()) //Cannot use just foo(Bar()) as you would in Scala 2
您还可以在 Scala 3 中使用隐式按名称参数。

给定的
Givens 也与隐式 vals/objects/methods 非常相似。
它们的一个好处是它们可以是匿名的,并且编译器会为它们生成一个名称,类似于 given_F_X_Y。如果给定的类型是 F[X, Y] .更多详情 here .
另一个变化是给定的类型必须显式写入 - 它不能像 Scala 2 中的隐式那样推断。
没有参数的给定映射到 implicit object . given foo: Foo with {...}变得只是 implicit object foo extends Foo {...} .
带参数的给定类似于 implicit def只接收更多 implicit参数。
given listOrd[T](using ord: Ord[T]): Ord[List[T]] with { ... }
//^^ this maps to this vv
class listOrd[T](implicit ord: Ord[T]) extends Ord[List[T]] { ... }
final implicit def listOrd[T](implicit ord: Ord[T]): listOrd[T] = new listOrd[T]
一个只是别名的给定变成了 implicit def如果它只是一个引用,或者 implicit lazy val除此以外。
val foo: Foo
given Foo = foo
会变成 final implicit def given_Foo = foo (注意编译器生成的名称),但是
given foo: Foo = new Foo()
会变成 final implicit lazy val foo: Foo = new Foo()因为 new Foo()不应进行不必要的计算。

而不是使用 implicit def对于来自 A 的隐式转换至 B ,您现在可以定义给定的 Conversion[A, B] 实例。
在 Dotty 中仍然可以使用隐式类,但可以直接定义 extension methods .虽然扩展中的方法不能接受它们自己的类型参数,但它们比隐式类更容易使用。
Scala 3 中的附加更改 - summon是一种类似 implicitly 的方法,但它可以返回比请求的类型更具体的类型。

关于scala - 给出/使用 Scala 2 隐式和 Scala 3 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65270416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com