Link Search Menu Expand Document

可变参数拼接

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

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 选项下提供了从旧语法到新语法的自动重写功能。