Scala:直接在模式匹配块

时间:2016-07-30 09:55:42

标签: regex scala pattern-matching

我有以下正则表达式与模式匹配:

val url = "/en/about"
val langRegex = "/(.{2}).*".r

val lang = url match {
  case langRegex(lang) => lang
  case _ => "en"
}

但我希望实现这样的目标(我不想为正则表达式创建额外的变量,而是将其直接放在匹配块中)

val url = "/en/about"
val lang = url match {
  case "/(.{2}).*".r(lang) => lang
  case _ => "en"
}

我在第二种情况下遇到编译器错误?我只是将 langRegex(lang)替换为“/(。{2})。*”。r ,这些表达式应该相等,不应该吗?

为什么这是一个错误?

1 个答案:

答案 0 :(得分:4)

这不起作用,因为您只能匹配http://scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html中定义的。 在第一个示例中,您的匹配格式为StableId ‘(’ [Patterns] ‘)’,其中StableIdvalueobject但不是def,可以在执行时随时更改

您的第二个示例无效,因为"/(.{2}).*".r不是StableId。您的第二个示例无效,因为以下示例也无效:

val url = "/en/about"
def langRegex = "/(.{2}).*".r

val lang = url match {
  case langRegex(lang) => lang
  case _ => "en"
}

我将langRegex定义更改为def,因此不再是StableId。