【问题标题】:Scala 3 implicit conversions: compare value and literalScala 3 隐式转换:比较值和文字
【发布时间】:2021-12-16 05:03:10
【问题描述】:

我有一个不透明类型FancyDouble,它是通过在伴随对象范围内使用given Conversion[Double, FancyDouble] = FancyDouble(_) 从Double 隐式转换而来的。之后,构造val d: FancyDouble = 0.0 工作,但是当我尝试像if (d == 0.0) 那样进行比较时,编译器抱怨我无法比较FanceDouble 和Double(我希望它应该隐式转换0.0 字面量转换为 FancyDouble,就像之前的情况一样。

如何启用与隐式转换的比较?

【问题讨论】:

标签: scala implicit-conversion scala-3


【解决方案1】:

平等本质上定义为(Any, Any) => Boolean。主要是因为 Java 遗留问题。这意味着在fancyDouble == double 中,double 的预期表达式类型是Any,并且不会触发任何隐式转换。

然而 Scala 3 introduced CanEqual 类型类使相等更安全一些。如果要比较 A 和 B 类型的值,CanEqual[A, B] 的隐式实例需要在隐式范围内。

object fancy {
  opaque type FancyDouble = Double
  def make(d: Double): FancyDouble = d

  given CanEqual[FancyDouble, Double] = CanEqual.derived
  given CanEqual[Double, FancyDouble] = CanEqual.derived
}

val a = 4.2
val b = fancy.make(4.2)

assert(a == b) // ok
assert(b == a) // ok

如果启用strictEquality 标志,您甚至需要CanEqual[FancyDouble, FancyDouble] 来比较两个FancyDoubles。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多