Scala 如何将MapTo正确用于Sum类型
我不知道为什么下面没有打印“它是A” 其结果如下:Scala 如何将MapTo正确用于Sum类型,scala,Scala,我不知道为什么下面没有打印“它是A” 其结果如下: java.util.NoSuchElementException: None.get at scala.None$.get(Option.scala:347) at scala.None$.get(Option.scala:345) ... 31 elided 我想我可以用mapTo将A转换成Foo,然后对其进行案例分析。这是我正在使用Akka的问题和程序的简化版本。ask(actor,msg)。mapTo[T]是一个从Future[Any]
java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:347)
at scala.None$.get(Option.scala:345)
... 31 elided
我想我可以用mapTo将A
转换成Foo
,然后对其进行案例分析。这是我正在使用Akka的问题和程序的简化版本。ask(actor,msg)。mapTo[T]
是一个从Future[Any]
到Future[T]
的过程,您似乎正确地使用了它。失败是由于值。获取。试着这样把它去掉
object futureMapToExample extends App {
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
sealed trait Foo
case object A extends Foo
case object B extends Foo
val a = Future.successful(A)
a.mapTo[Foo].map {
case A => println("it is an A")
case B => println("it is a B")
}
Thread.sleep(1000)
}
它应该打印出来
it is an A
使用value.get
失败的原因是Future
此时尚未完成。请注意我是如何添加Thread.sleep(1000)
hack的,以便给未来的一些时间来完成。这只是为了演示,不应在生产中进行。一般来说,如果可能的话,应该避免调用get
,因为它们是不安全的。cool-这很有效。基本上,我有一个Akka程序,它发送回另一个参与者(将来)的消息是一个总和类型,所以我需要从提问中得到响应,映射到封闭特征的类型,然后进行案例分析。这是mapTo的有效用法吗?@Mojo Yesask(actor,msg)。mapTo[T]
是一种从Future[Any]
到Future[T]
的安全方式,谢谢你,伙计-我真的不喜欢Akka。在我转到上面的解决方案之前,我设法编译了一个程序,在这个程序中,我发回了Future[String,Unit]类型的消息,然后在接收actor中,我做了一个到case类Foo类型的映射(res:oring[String,Unit]猜猜它是怎么编译的!!我不确定Mpto是如何把它投射到一个FO上的,但是我怀疑它试图调用CASE类上的Apple方法并做CAST。
it is an A