Scala管道模式匹配作为一个变量



通常需要对多个值执行相同的代码。使用match可以使用|(管道)操作符:

val state = "stopped"
val value = 0
(state, value) match {
case ("running" | "pending", 0)   => println("running with no value")
case ("stopped" | "cancelled", 0) => println("not running; no value")
case ("running" | "pending", _)   => println("running with a value")
case ("stopped" | "cancelled", _) => println("not running with a value")
case _                            => println("unknown state")
}

是否有一种方法可以将管道写成一个变量,例如:

val runningStates    = "running" | "pending"
val nonRunningStates = "stopped" | "cancelled"
所以我可以在上面的模式匹配中使用这些:
(state, value) match {
case (runningStates, 0)    => println("running with no value")
case (nonRunningStates, 0) => println("not running; no value")
case (runningStates, _)    => println("running with a value")
case (nonRunningStates, _) => println("not running with a value")
case _                     => println("unknown state")
}

你实际问题的答案是否定的,你不能把管道写成变量。

模式选择章节(8.1.12)中的Scala语言参考说:

A模式选择p1|…| pn由许多可选模式pi。所有可选模式使用模式的预期类型进行类型检查。他们可能不会绑定通配符以外的变量。另一种模式匹配a值v,如果至少有一个选项匹配v

所以管道|没有在库中实现,但它由Scala编译器解释,并且它对模式匹配是上下文敏感的。

最新更新