【问题标题】:In scala, is it possible to discourage the compiler from searching for Predef implicit first?在 scala 中,是否可以阻止编译器先搜索 Predef 隐式?
【发布时间】:2021-02-23 20:26:42
【问题描述】:

这篇文章:

Where does Scala look for implicits?

描述了现代 scala 编译器使用的隐式搜索优先级和算法。在上面的列表中,直接导入的隐式函数应该比关联类型中的范围具有更高的优先级(例如,在伴随对象中定义)

这个规则大部分时间都是有意义的,直到直接导入的 Predef.scala 开始干扰:

    case class A(v: Int)

    object A {

      implicit class AFns(self: A) {

        def +(v2: Int): A = A(self.v + v2)
      }
    }

    val a1 = A(3)

    val b = a1 + 4

    assert(b == A(7))

上面的示例应该可以成功编译,但是 Predef 中定义的所有类的 + 运算符覆盖主导了场景,并导致所有带有 + 运算符的扩展都无用(除非在更严格的范围内显式导入)。这很烦人,有没有办法禁用 Predef 中的隐式或“降级”它的优先级?

以上实验已经在scala 2.12.12 & 2.13.3中进行过

【问题讨论】:

    标签: scala implicit scala-compiler


    【解决方案1】:

    显式导入A._ works,但您也可以使用-Yimports,将其添加到您的build.sbt 以省略scala.Predef._ 导入:

    scalacOptions ++= Seq("-Yimports", "java.lang", "scala")
    

    之后,您可以从Predef 导入除any2stringadd 类之外的所有内容:

    import Predef.{any2stringadd => _, _}
    

    Here's一个斯卡斯蒂。

    【讨论】:

    • 看起来这是目前唯一可行的方法。希望 Predef 以后能有自己的优先权
    猜你喜欢
    • 2012-02-21
    • 2019-10-02
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多