我们在整个代码库中散布着这样的代码:
def receive: Receive = {
case x: TypeX => doXishThingsWith(x)
case y: TypeY => doYishThingsWith(y)
case z: TypeZ => doZishThingsWith(z)
}
我发现有必要给
x
,y
和z
命名而有些愚蠢和混乱。我想知道这样的事情是否可行?
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/