Scala模式匹配中rest*与rest @ _*的差异及报错原因
Scala模式匹配中
rest*与rest @ _*的差异及"bad simple pattern"错误原因 两种写法的核心差异
先明确两种模式匹配写法:
- 简化写法:
val List(a, b, c, rest*) = ... - 标准写法:
val List(a, b, c, rest @ _*) = ...
"bad simple pattern"错误的触发原因
问题根源在于Scala的模式匹配语法规则限制:
- 不带
@的rest*是一种语法糖,仅允许出现在顶层简单模式中——也就是直接用于最外层的变量解构赋值场景。一旦将这种写法嵌套到其他模式(比如case类模式、嵌套集合模式)内部,编译器会判定它不符合"简单模式"的定义,从而抛出"bad simple pattern"错误。 rest @ _*是标准的绑定模式,通过@符号将可变长度的剩余元素绑定到rest变量上,这种写法不受场景限制,无论是顶层解构还是嵌套模式中都能正常编译运行。
触发错误的示例
比如在嵌套模式中使用简化写法就会报错:
case class Wrapper(list: List[Int]) // 会触发"bad simple pattern"错误 val Wrapper(List(a, b, c, rest*)) = Wrapper(List(1,2,3,4,5))
换成标准写法则正常工作:
case class Wrapper(list: List[Int]) // 编译正常 val Wrapper(List(a, b, c, rest @ _*)) = Wrapper(List(1,2,3,4,5))
总结
rest*仅适合顶层直接解构赋值的简单场景,属于受限的语法糖;rest @ _*是通用合法写法,覆盖所有模式匹配场景,不会触发语法错误。
内容的提问来源于stack exchange,提问作者Each One Chew
相关产品推荐
相关产品推荐

