考虑以下Scala案例类:
case class WideLoad(a: String, b: Int, c: Float, d: ActorRef, e: Date)
模式匹配使我可以提取一个字段并丢弃其他字段,如下所示:
someVal match {
case WideLoad(_, _, _, d, _) => d ! SomeMessage(...)
}
我想做的是,当case类具有约20个奇数字段时,更有意义的是,以不涉及键入
WideLoad(_, _, _, _, _, some, _, _, _, thing, _, _, interesting)
的方式仅提取几个值。我希望命名的args可以在这里提供帮助,尽管以下语法无效:
someVal match {
case WideLoad(d = dActor) => dActor ! SomeMessage(...)
// ^---------- does not compile
}
这里有什么希望吗,还是我坚持输入很多
_, _, _, _
?编辑:我知道我可以做
case wl @ WideLoad(...whatever...) => wl.d
,但我仍然想知道是否甚至有更简短的语法可以满足我的需要,而不必引入额外的val
。 最佳答案
我不知道这是否合适,但是您也可以构建一个对象来匹配该字段或该字段集(未经测试的代码):
object WideLoadActorRef {
def unapply(wl: WideLoad): Option[ActorRef] = { Some(wl.d) }
}
someVal match {
case WideLoadActorRef(d) => d ! someMessage
}
甚至
object WideLoadBnD {
def unapplySeq(wl: WideLoad): Option[(Int,ActorRef)] = { Some((wl.b,wl.d)) }
}
someVal match {
case WideLoadBnD(b, d) => d ! SomeMessage(b)
}