2012-03-04 4 views
1

기본값이있는 일부 매개 변수로 사례 클래스를 정의하려고 시도하지만 기본값에 암시 적 매개 변수가 필요합니다.암시 적 매개 변수가있는 오버로드 된 case 클래스 생성자?

case class ChannelLatches(started: TestLatch, stopped: TestLatch)(implicit system: ActorSystem) { 
    def this()(implicit system: ActorSystem) = this(new TestLatch(), new TestLatch())(system) 
} 

이 :

case class ChannelLatches(started: TestLatch, stopped: TestLatch)(implicit system: ActorSystem) { 
    def this()(implicit system: ActorSystem) = this(new TestLatch(), new TestLatch())(system) 
} 

하지만 두 경우 모두, 컴파일러가 나의 새로운 생성자를 인식하지 못합니다 나는 이런 식으로 뭔가를 시도했습니다. 어떤 포인터?

+0

경우 클래스 ChannelLatches는 (시작 : TestLatch = 새로운 TestLatch는 중지 : TestLatch = 새로운 TestLatch) (암시 적 시스템 : ActorSystem가) { } – Eastsun

+0

이 내가 원래했지만, 컴파일러와 같은 오류가 발생합니다 것입니다 : 매개 변수 시스템 : akka.actor.ActorSystem에 대한 암시 적 값을 찾을 수 없습니다. 시스템은 후속 매개 변수 목록에 정의되어 있으므로 가정합니다. – jxstanford

답변

4

문제는 사례 클래스 또는 생성자에 없습니다.

scala> val channelLatches = new ChannelLatches 
<console>:11: error: could not find implicit value for parameter system: ActorSystem 
     val channelLatches = new ChannelLatches 
          ^

과 같은 컴파일 오류가 발생하면 범위에서 단일 식별자로 사용할 수있는 암시 적 변수 ActorSystem이 없다는 것을 의미합니다.

두 코드 예제 (그들은 바로 정확히 같은 코드인가?)와 Eastsun의 예 @는 완벽하게 합법적 코드입니다 :

scala> class ActorSystem 
defined class ActorSystem 

scala> class TestLatch 
defined class TestLatch 

scala> case class ChannelLatches(started: TestLatch = new TestLatch, stopped: TestLatch = new TestLatch)(implicit system: ActorSystem) 
defined class ChannelLatches 

scala> implicit val actor = new ActorSystem 
actor: ActorSystem = [email protected] 

scala> val channelLatches = new ChannelLatches 
channelLatches: ChannelLatches = ChannelLatches([email protected],[email protected]) 

참고 컴파일러를 제공하는 것이 가능하게 암시 발 배우 암시 적으로 매개 변수가 누락되었습니다.

암시 적 매개 변수에 대한 소개는 A Tour of Scala: Implicit Parameters을 참조하십시오.

--- 편집 2012-03-05 : 추가 된 다른 예를 ChannelLatches이

당신이 ChannelLatches 뭔가의 내부 클래스 있으려면 뭔가의 내부 클래스입니다, 당신은 정말 ActorSystem을 통과 할 필요가 없습니다 내부 클래스가 외부 객체의 값에 액세스 할 수 있으므로 인스턴스를 내부 클래스 인스턴스에 전달할 수 있습니다. A Tour of Scala: Inner Classes

scala> class ActorSystem 
defined class ActorSystem 

scala> class TestLatch 
defined class TestLatch 

scala> class Something(implicit val as: ActorSystem) { 
    | case class ChannelLatches(started: TestLatch, stopped: TestLatch) { 
    |  def this() = this(new TestLatch(), new TestLatch()) 
    | 
    |  def actorSystem = as 
    | } 
    | } 
defined class Something 

scala> implicit val as = new ActorSystem 
as: ActorSystem = [email protected] 

scala> val s = new Something 
s: Something = [email protected] 

scala> val cl = new s.ChannelLatches 
cl: s.ChannelLatches = ChannelLatches([email protected],[email protected]) 

scala> cl.actorSystem == as 
res0: Boolean = true 
+0

범위에 암시 적 시스템이있는 무언가의 내부 클래스가되지 않도록 ChannelLatches를 찾는 방법을 찾으려고합니다. 이것이 내가 케이스 클래스에서 암시적인 param을 정의한 이유입니다. (물론,이 문맥에서는 작동하지 않습니다.) ActorSystem은 호출자가 제공해야합니다. – jxstanford

관련 문제