在 GitHub 上编辑此页面

可变参数拼接

模式和函数参数中可变参数拼接的语法已更改。新语法使用后缀 *,类似于声明可变参数参数的方式。

val arr = Array(0, 1, 2, 3)
val lst = List(arr*)                   // vararg splice argument
lst match
  case List(0, 1, xs*) => println(xs)  // binds xs to Seq(2, 3)
  case List(1, _*) =>                  // wildcard pattern

拼接参数的旧语法将逐步淘汰。

/*!*/ val lst = List(arr: _*)      // syntax error
      lst match
        case List(0, 1, xs @ _*)  // ok, equivalent to `xs*`

语法

ArgumentPatterns  ::=  ‘(’ [Patterns] ‘)’
                    |  ‘(’ [Patterns ‘,’] Pattern2 ‘*’ ‘)’

ParArgumentExprs  ::=  ‘(’ [‘using’] ExprsInParens ‘)’
                    |  ‘(’ [ExprsInParens ‘,’] PostfixExpr ‘*’ ‘)’

兼容性注意事项

为了实现 Scala 2 和 Scala 3 之间的交叉编译,编译器将接受旧语法和新语法。在 -source future 设置下,遇到旧语法时会发出错误。在 -source future-migration 下,提供从旧语法到新语法的自动重写。