2012-10-08 44 views
1

当查找含义时,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建议)是,如果我们颠倒了顺序 - 也就是说,我们在case class Bar之前定义了object Bar - 编译得很好。

这是编译器错误吗?或者我错过了关于Scala范围规则的一些事情?

我还应该提到,这个问题只会出现在隐式解析中。如果我们明确地通过了BarCounter对象,一切都编译好。

+0

我不知道为什么,但是切换'object Foo'和'case class Foo'的顺序使得它不会引发编译错误。 – rjsvaljean

+0

@rjsvaljean奇怪 - lloks喜欢编译器故障。你介意加入它作为回应,以便我可以接受它吗? – Andrea

+1

我不知道。编辑包含该数据的问题是否更有用,并等待解释为什么它无法编译而不是解决问题的答案?甚至可能完全改变这个问题,使它更通用并重新发布。 – rjsvaljean

回答

1

它似乎是一个实际的编译器错误。我已经发布了它here