【发布时间】:2019-09-13 19:40:14
【问题描述】:
考虑以下 Scala 案例类:
case class WideLoad(a: String, b: Int, c: Float, d: ActorRef, e: Date)
模式匹配允许我提取一个字段并丢弃其他字段,如下所示:
someVal match {
case WideLoad(_, _, _, d, _) => d ! SomeMessage(...)
}
我想做的,以及当一个案例类有大约 20 个奇数字段时更相关的是,以不涉及输入 WideLoad(_, _, _, _, _, some, _, _, _, thing, _, _, interesting) 的方式仅提取几个值。
我希望命名 args 可以在这里提供帮助,尽管以下语法不起作用:
someVal match {
case WideLoad(d = dActor) => dActor ! SomeMessage(...)
// ^---------- does not compile
}
这里有什么希望吗,还是我卡住了很多很多_, _, _, _?
编辑:我知道我可以做到case wl @ WideLoad(...whatever...) => wl.d,但我仍然想知道是否有更简洁的语法可以满足我的需要,而无需引入额外的val。
【问题讨论】:
-
即使有 4 或 5 个字段,所有的下划线都会使其难以阅读。命名参数语法会大大提高可读性,但据我所知,目前还没有这样的语法。
-
我的印象是长参数列表通常是要避免的。
-
你的意思是 case WideLoad (d == dActor)
-
有一个关于这个问题的 SIP:issues.scala-lang.org/browse/SI-6524
-
@JamesMoore 关于这个问题,我想知道是否可以从 import 语句的语法中获得灵感。我们有
import org.apache.{foo,bar=>bat}导入 foo 和 bar,将后者重命名为 bat。以同样的方式我们可以做到case WideLoad{d=>actorRef} if actorRef == 42 => SomeMessage(...)