我想写一些干净的pattern-matching
代码。
我有List
Regex
:
val myList = List(
".+\\.a".r,
".+\\.b".r,
".+\\.c".r.+
)
我想做一些接近以下的事情:
myInputString match {
case matchAnyRegexFromMyList(s) => //do something
}
作为替代:
myInputString match {
case regex1(a)|regex2(b)... => //do something
}
至少可以更简洁吗?
答案 0 :(得分:3)
在运行时无法生成case子句。您可以编写一个宏来在编译时创建它们。
您可以使用自定义提取器:
case class MultiPattern(patterns: List[Regex]) {
def unapply(s: String): Option[String] =
patterns.flatMap(_.findFirstIn(s)).headOption
}
val myMultiPattern = MultiPattern(myList)
val myInputString = "x.b"
myInputString match {
case myMultiPattern(s) => println(s) // output: x.b
}
答案 1 :(得分:3)
如果你的模式没有预编译,你可以在编译时将它们组合起来。
onClick