[英]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.