2012-10-08 3 views
1

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] 말을 컴파일에 실패 - 나는 스칼라 2.9.1을 사용하고 있습니다.

재미있는 점은 (rjsvaljean에서 제안한) 우리가 순서를 바꾸면 object Barcase class Bar 앞에 정의한다는 것입니다.

이 오류는 컴파일러 버그입니까? 아니면 스칼라의 범위 규칙에 대해 뭔가 빠졌습니까?

또한이 문제는 암시 적 해결에서만 발생한다고 언급해야합니다. 우리가 명시 적으로 BarCounter 객체를 전달하면 모든 것이 잘 컴파일됩니다.

+0

이유는 모르지만'object Foo'와'case class Foo'의 순서를 바꾸면 컴파일 오류가 발생하지 않습니다. – rjsvaljean

+0

@rjsvaljean 이상한 - 컴파일러 결함과 같은 lloks. 내가 그것을 받아 들일 수 있도록 응답으로 추가 하시겠습니까? – Andrea

+1

잘 모르겠습니다. 해당 데이터를 포함하여 질문을 편집하고 그것을 수정하는 대신 컴파일에 실패한 이유를 설명하는 응답을 기다리는 것이 더 유용하지 않습니까? 어쩌면이 질문을 완전히 일반화하고 다시 게시하기 위해 변경하십시오. – rjsvaljean

답변

1

실제 컴파일러 버그 인 것 같습니다. 나는 그것을 게시했다 here.

관련 문제