【问题标题】:cons operator in case statements in ScalaScala中case语句中的cons运算符
【发布时间】:2018-05-08 18:28:15
【问题描述】:

所以我读到了右关联运算符,例如 Scala 中的 cons 运算符。我想知道为什么它们在案例陈述中起作用。看来您可以在这里使用 cons 语句进行模式匹配?

def findKth1[A](k:Int, l:List[A]):A = (k, l) match {
    case (0, h::_) => h
    case(k, _::tail) if k > 0 => findKth1(k - 1, tail)
    case _ => throw new NoSuchElementException
}

findKth1(2, List(3,4,5,6))  

res1: Int = 5

占位符在这里做什么?我只见过这样的函数中使用的占位符:<SomeList>.map(_.doThing)。是同一个概念吗?

:: 和 ::: 的唯一区别是 ::: 用于 2 个列表,对吗?

【问题讨论】:

  • “占位符”到底是什么意思? _ ?这只是意味着您实际上并不想将那里的内容绑定到实际的命名绑定。第一种情况只在头部匹配;第二种只匹配尾部,最后一种情况是默认情况。
  • 这个模式真的匹配元组吗?
  • @Jwan622 是的。看起来像。我无法编辑我的原始评论,但“仅在头部”指的是元组中的第二个元素。

标签: scala


【解决方案1】:

tl;dr 这不是模式匹配运算符,而是模式匹配一​​个名为 :: 的案例类

有几件事同时发生。首先可能会有点混淆,因为::是List上的一个方法:

val x: List[Int] = 1 :: 2 :: 3 :: Nil

但是也有一个case class ::,根据文档是:

A non empty list characterized by a head and a tail.

More info here

Scala 的案例类自动带有提取器方法 (unapply),允许进行模式匹配,如 case User(name, age) => ...。

你也可以在中缀的位置使用case类名(虽然你不应该这样做,除非case类像操作符一样使用,比如在这个例子中) .所以case head :: tail => ... 与case ::(head, tail) => ... 相同。 More info here

当模式匹配时,你可以使用_来表示那里会有一个值,但是你不关心它,所以你没有给它一个名字。

所以你提供的三种情况大致是:

  • 第一个值为 0 的元组,第二个值是一个列表,其头部称为 h,尾部我们将忽略。
  • 一个带有一些整数的元组被称为k,一个带有一个我们不关心的头部和一个尾部的列表,我们称之为tail。此外,k 必须大于 0
  • 其他任何事情,然后抛出 NoSuchElementException

【讨论】:

  • 快速提问,我没有意识到这里的案例陈述与案例类是一样的......
  • 是的,case 关键字有多种用途可能有点令人困惑,但是当您使用它来匹配案例类时它看起来不错。
猜你喜欢
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多