模式匹配列表 'init' 和 'last' 而不是 'head' 和 'tail'

Pattern match against List 'init' and 'last' instead of 'head' and 'tail'

我知道可以轻松地针对 List:

head(或任意数量的初始元素)和 tail 进行模式匹配
val items = List(1, 2, 3, 4)
val first :: rest = items

println(first, rest) // 1, List(2, 3, 4)

但是,我想用另一种方式来做 - 你可以使用模式来获取列表的 initlast 吗?

val items = List(1, 2, 3, 4)
val rest ??? last = items

println(rest, last) // List(1, 2, 3), 4

在 JavaScript 中看起来像:

const [...init, last] = items

您可以使用 :+ custom extractor object.

所以代码看起来像这样:

val rest :+ last = items

但是,请注意,这与执行以下操作同样低效:

val last :: rest = items.reverse

但是,如果你需要再次分解rest,那么reversing先分解会更有效率。

最后,请记住两者都是不安全的,因为它们会在 List 为空的情况下抛出异常。

这应该有效:

val xs :+ x = items

查看:https://www.scala-lang.org/files/archive/api/2.12.0/scala/collection/Seq.html#:+(elem:A):Seq[A]