2017-09-26 1 views
2

으로 선언 된 lazy val에서 패턴 일치가 가능합니까?스칼라에서 느긋한 밸리에 패턴 매칭이 있습니까?

lazy val kafkaProducer: Try[producer.KafkaProducer[Array[Byte], String]] = Try(kafkaProducerSettings.createKafkaProducer()) 
... 
kafkaProducer.get match { 
    case Success(_) => Source.single(producerRecord()).runWith(Producer.plainSink(kafkaProducerSettings, kafkaProducer.get)) 
    case Failure(x) => Future.failed(x) 
} 

는이 오류 받고 있어요 :

constructor cannot be instantiated to expected type; 
[error] found : akka.actor.Status.Success 
[error] required: org.apache.kafka.clients.producer.KafkaProducer[Array[Byte],String] 
[error]   case Success(_) => Source.single(producerRecord()).runWith(Producer.plainSink(kafkaProducerSettings, kafkaProducer.get)) 

참고이 대체 코드가 작동을하지만, 나는 그것이 "스칼라 방식"이다 확실하지 않다 :

lazy val kafkaProducer: producer.KafkaProducer[Array[Byte], String] = kafkaProducerSettings.createKafkaProducer() 
... 
val tryAccessLazyKafkaProducer = Try(kafkaProducer) 
if (tryAccessLazyKafkaProducer.isSuccess) { 
    Source.single(producerRecord()).runWith(Producer.plainSink(kafkaProducerSettings, kafkaProducer)) 
} else { 
    Future.failed(tryAccessLazyKafkaProducer.failed.get) 
} 

답변

5

그것은 확실히이다 가능하다면, 당신은 단지 타입을 가져 왔습니다 :

found : akka.actor.Status.Success 

당신은 당신이 안 scala.util.Success 대신

한 가지는 반환 유형이 Failure 경우 폭발 호출 Try.get입니다 필요합니다. 대신, 수행

import scala.util.Success 
import scala.util.Failure 

kafkaProducer match { 
    case Success(producer) => Source.single(producerRecord()).runWith(Producer.plainSink(kafkaProducerSettings, producer)) 
    case failure: Failure => failure 
} 

lazy는 값이 오직 한 번 평가됩니다 확인합니다 단지 언어 구조이다. 게으른 것이 든 아니든간에 기본 유형은 여전히 ​​당신이 그것을 할 수있는 Try입니다.

관련 문제