模式匹配列表 '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)
但是,我想用另一种方式来做 - 你可以使用模式来获取列表的 init
和 last
吗?
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]
我知道可以轻松地针对 List
:
head
(或任意数量的初始元素)和 tail
进行模式匹配
val items = List(1, 2, 3, 4)
val first :: rest = items
println(first, rest) // 1, List(2, 3, 4)
但是,我想用另一种方式来做 - 你可以使用模式来获取列表的 init
和 last
吗?
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]