在Scala中定义的事项顺序?(Order of definition matters in Sca

2019-10-17 07:17发布

当寻找implicits,Scala编译器看起来,在其他地方,在所涉及的类的各个部分的同伴对象。 很显然,虽然,它不能当隐式转换的类本身是用来执行该查询,如果同伴对象之前定义。 该小例子,我能够编造是:

trait Counter[A] {
  def count(a: A): Int
}

object Foo {
  def foo[A](a: A)(implicit c: Counter[A]) = c.count(a)
}

case class Bar(id: Int) {
  import Foo._

  def count = foo(this)
}

object Bar {
  implicit object BarCounter extends Counter[Bar] {
    def count(b: Bar) = b.id
  }
}

这编译失败说could not find implicit value for parameter c: Counter[Bar] -我使用Scala的2.9.1。

有趣的(由rjsvaljean建议)是,如果我们颠倒顺序-也就是说,我们定义object Bar之前case class Bar - verything编译罚款。

这是一个编译器错误? 或者我失去了一些东西有关Scala的范围规则?

我还要提到的是这个问题只与隐含的分辨率就出现了。 如果我们明确地传递BarCounter对象,一切编译罚款。

Answer 1:

这似乎是一个实际的编译器错误。 我已经张贴在这里 。



文章来源: Order of definition matters in Scala?