You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:22:34