提问人:steinybot 提问时间:10/12/2023 更新时间:10/12/2023 访问量:43
为什么 Scala 3 中没有身份转换?
Why is there no identity Conversion in Scala 3?
问:
Scala 不支持隐式转换链接(有充分的理由)。在设计一个 API 时,有一些不幸的情况,它提供了隐式转换,你需要它来链接。
使用 Scala 2 隐式,这很容易解决,因为它允许有另一个隐式转换作为参数。例如:
implicit def fromUndefOr[A, Result](j: UndefOr[A])(implicit conv: A => TypedReactElement[Result]): TypedReactElement[Result] =
j.fold(null.asInstanceOf[TypedReactElement[Result]])(conv)
在 Scala 3 中,这可能如下所示:
given fromOption[A, Result](using conv: Conversion[A, TypedReactElement[Result]]): Conversion[Option[A], TypedReactElement[Result]] =
_.fold(null.asInstanceOf[TypedReactElement[Result]])(conv)
然而,使用 Scala 3 有一个主要的缺点。没有身份转换。这意味着微不足道的情况将失败:Conversion
def mayConvert[A, B](using conv: Conversion[A, B])(a: A): B =
conv(a)
val noConversion: Int = mayConvert(123)
// No given instance of type Conversion[A, B] was found for parameter conv of method mayConvert in object Playground
这很烦人,也是坚持使用 s 的另一个原因。implicit def
这有什么好的理由吗?
答: 暂无答案
上一个:指向二维数组访问冲突的指针
评论
val a: A; def f(b: B); f(a) /* convert A to B*/
Function[A, B]
implicit List[String]]
Int => String
Decoder[A]
Conversion
TypedReactElement[Result]
A
TypedReactElement[Result]
def f(a: TypedReactElement[Result])
A
def f(a: js.UndefOr[TypedReactElement[Result]])
A
Converter
Conversion
Converter