考虑以下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)
}

10-06 14:42