我们在整个代码库中散布着这样的代码:

def receive: Receive = {
  case x: TypeX => doXishThingsWith(x)
  case y: TypeY => doYishThingsWith(y)
  case z: TypeZ => doZishThingsWith(z)
}


我发现有必要给xyz命名而有些愚蠢和混乱。

我想知道这样的事情是否可行?

def receive: Receive = {
  case TypeX => doXishThingsWith(_)
  case TypeY => doYishThingsWith(_)
  case TypeZ => doZishThingsWith(_)
}


我不知道_是否真的以这种方式工作。但是也许有类似的东西?

最佳答案

否。case a: A => m(a)是最短的解决方案。
对于case TypeX,您要尝试匹配TypeX的伴随对象,因此必须使用下划线或变量名:case _: TypeX
使用case _: TypeX,您无权访问变量。
解决方法
实际上,您可以使用无变量名称的方法,例如:

def receive: Receive = (
  pf[TypeX](doXishThingsWith) orElse
  pf[TypeY](doYishThingsWith) orElse
  pf[TypeZ](doZishThingsWith)
)

您必须像这样创建方法pf
import reflect.{ClassTag, classTag}

def pf[T: ClassTag](f: T => _): PartialFunction[Any, Unit] = {
  case e if classTag[T].runtimeClass.isInstance(e) => f(e.asInstanceOf[T])
}

例:
class A; class B; class C

def mA(a: A) = println(s"mA!")
def mB(b: B) = println(s"mB!")

val receive = pf(mA) orElse pf(mB)

scala> receive.lift(new A)
mA!
res0: Option[Unit] = Some(())

scala> receive.lift(new B)
mB!
res1: Option[Unit] = Some(())

scala> receive.lift(new C)
res2: Option[Unit] = None

关于scala - Scala + Akka:类型上的模式匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21638526/

10-15 18:24