繁体   English   中英

Scala中PartialFunction的组成

[英]Composition of PartialFunctions in Scala

我正在和akka演员合作。 所有参与者都应该实现receive方法,该方法具有PartialFunction[Any, Unit]的签名。 我想定义一个更严格的函数来用于匹配签名,如PartialFunction[Action, Unit] 但是,这不编译:

class PlayerActor extends Actor with {
  override def receive: Receive = rec

  def rec: PartialFunction[Action, Unit] = {
    case Jump() =>
  }
}

我想这样做,所以如果我忘记了一个案例,编译器会警告我。

Receive定义为type Receive = PartialFunction[Any, Unit]


我最终手动完成了这样做:

override def receive = {
  case a: Action => rec(a)
}

它也可以通过铸造来完成:

override def receive = rec.asInstanceOf[PartialFunction[Any, Unit]]

或者通过隐式转换:

implicit def toAnyPartial[T](f: PartialFunction[T, Unit]): PartialFunction[Any, Unit] =
  f.asInstanceOf[PartialFunction[Any, Unit]]

你可以试试这个

def rec: Receive  = { case a: Action => a match {
  case Jump() =>
}}

PartialFunction在其第一个类型参数上是逆变的。 我不会深入解释这意味着什么(有书籍,博客文章,SO问题和答案),但会给你非常简单的例子。

您可以通过Any receive 如果可以将rec指定给receive ,则意味着您可以将Any传递给rec ,从而绕过rec的类型。 编译器禁止它。

如果您只想使用PartialFunction[T, Unit]类型的实现创建PartialFunction[Any, Unit] PartialFunction[T, Unit]您可以尝试这样做:

implicit def toPfAny[T](pf: PartialFunction[T, Unit]): PartialFunction[Any, Unit] = {
  object PF { def unapply(a: T): Option[Unit] = pf.lift(a) }
  { case PF(_) => () }
}

用法:

scala> def impl: PartialFunction[String, Unit] = { case s => println(s) }
impl: PartialFunction[String,Unit]

scala> def receive: PartialFunction[Any, Unit] = impl
receive: PartialFunction[Any,Unit]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM