【问题标题】:Pattern match against List 'init' and 'last' instead of 'head' and 'tail'模式匹配 List 'init' 和 'last' 而不是 'head' 和 'tail'
【发布时间】:2021-03-25 05:07:30
【问题描述】:

我知道可以轻松地对head(或任意数量的初始元素)和tailList 进行模式匹配:

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

【问题讨论】:

标签: list scala pattern-matching scala-collections


【解决方案1】:

您可以使用:+ 自定义extractor object

所以代码应该是这样的:

val rest :+ last = items

但是,请注意,这样做的效率同样低:

val last :: rest = items.reverse

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

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

【讨论】:

  • 酷!在任何地方都有像这样的所有内置提取器对象的文档吗?我在这里检查过,但没有看到 - scala-lang.org/api/current/scala/collection/immutable/…
  • @lan uhm no AFAIK,无论如何,stdlib 中没有太多自定义提取器。 - 你想知道什么?
  • 我只是想知道还有哪些可用的。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 2023-03-10
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多