使用Pekko(Akka)AskPattern的类型推断问题

wvyml7n5  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(169)

我使用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推断出正确的返回类型,有没有比显式命名类型更简单的方法来解决这个问题?

r55awzrz

r55awzrz1#

我想,这是因为ActorRef是反变的:ActorRef[Any]是匹配类型的“最具体”的子类,所以它与它一起使用我认为没有任何更干净的方法来使用ask反模式🤷。(有些人)称之为反模式是有原因的:)

相关问题