我有以下正则表达式与模式匹配:
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 ,这些表达式应该相等,不应该吗?
为什么这是一个错误?
答案 0 :(得分:4)
这不起作用,因为您只能匹配http://scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html中定义的值。
在第一个示例中,您的匹配格式为StableId ‘(’ [Patterns] ‘)’
,其中StableId
是value
或object
但不是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。