Scala 2隐式和Scala 3给定/使用之间的区别



Scala 2中的implicit关键字和Scala 3中的given+using关键字有什么区别?只是implicit被分成了两个关键词,还是语义也不同?如果是,如何?

在大多数情况下,它们是相同的。然而,implicit不再用于多个不同的概念。这些文档更详细,但以下是它们的摘要:

使用

在声明参数时,usingimplicit完全相同。但是,当显式传递隐式参数时,必须使用using:

def foo(using bar: Bar) = ???
foo(using Bar()) //Cannot use just foo(Bar()) as you would in Scala 2

您也可以在Scala3中使用隐式的按名称参数。


给定

Givens也与隐式vals/对象/方法非常相似。

它们的一个好处是,它们可以是匿名的,编译器会为它们生成一个名称,如果给定的类型是F[X, Y],它看起来有点像given_F_X_Y。更多详细信息请点击此处。

另一个变化是,给定的类型必须显式编写——不能像Scala2中的隐式那样推断。

给定的无参数映射到CCD_ 11。CCD_ 12就变成了CCD_。

给定的带参数类似于只接受更多implicit参数的implicit def

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()

将变为CCD_ 19,因为CCD_。


现在可以定义一个给定的Conversion[A, B]实例,而不是使用implicit def进行从AB的隐式转换。

您仍然可以在Dotty中使用隐式类,但可以直接定义扩展方法。虽然扩展中的方法不能采用自己的类型参数,但它们比隐式类更容易使用。

Scala3-summon中的另一个变化是类似implicitly的方法,但它可以返回比请求的类型更具体的类型。

语义也有所不同。在Scala 2中,Not可以用模糊技巧定义
trait Not[A]
object Not {
implicit def default[A]: Not[A] = null
implicit def ambig[A](implicit a: A): Not[A] = null
}
implicitly[Not[Int]] // compiles
implicit val s: String = null
// implicitly[Not[String]] // doesn't compile

但在Scala 3中,这是不起作用的,因为模糊性错误不会在中传播

trait Not[A]
object Not {
given [A]: Not[A] = null
given [A](using a: A): Not[A] = null
// given ambig[A](using a: A): Not[A] = null
}
summon[Not[Int]] // compiles
given String = null
summon[Not[String]] // compiles

应该使用scala.util.NotGiven而不是

summon[NotGiven[Int]] // compiles
given String = null
// summon[NotGiven[String]] // doesn't compile

(在3.0.0-M3-bin-20201211-dbc1186-NIGHTLY中测试(

http://dotty.epfl.ch/docs/reference/contextual/givens.html#negated-给定

http://dotty.epfl.ch/docs/reference/changed-features/implicit-resolution.html

相关内容

  • 没有找到相关文章

最新更新