我使用Ask模式来实现简单的RPC。
import org.apache.pekko.actor.typed.{ActorRef, Scheduler}
import org.apache.pekko.actor.typed.scaladsl.AskPattern.Askable
import org.apache.pekko.util.Timeout
import scala.concurrent.{ExecutionContext, Future}
case class RequestMessage(replyTo: ActorRef[ReplyMessage])
case class ReplyMessage(ok: Boolean)
def Fails(handler: ActorRef[RequestMessage])(using ExecutionContext, Timeout, Scheduler): Future[Boolean] =
handler.ask(rt => RequestMessage(rt)).map(_.ok)
def Ok(handler: ActorRef[RequestMessage])(using ExecutionContext, Timeout, Scheduler): Future[Boolean] =
handler.ask[ReplyMessage](rt => RequestMessage(rt)).map(_.ok)
函数Fails
给出以下错误:
value ok is not a member of Any
handler.ask(rt => RequestMessage(rt)).map(_.ok)
函数Ok
设置ask
的类型参数,并且不会给予错误。
为什么Scala 3不能为ask
推断出正确的返回类型,有没有比显式命名类型更简单的方法来解决这个问题?
1条答案
按热度按时间r55awzrz1#
我想,这是因为
ActorRef
是反变的:ActorRef[Any]
是匹配类型的“最具体”的子类,所以它与它一起使用我认为没有任何更干净的方法来使用ask反模式🤷。(有些人)称之为反模式是有原因的:)