list - 中缀运算符上的Scala匹配分解

标签 list scala match infix-operator

我试图了解 List 的实现在 Scala 中。特别是,我试图了解如何使用中缀运算符编写匹配表达式,例如:

a match {
  case Nil => "An empty list"
  case x :: Nil => "A list without a tail"
  case x :: xs => "A list with a tail"
}

如何允许匹配表达式为 x :: xs而不是 List(x, xs) ?

最佳答案

杰伊康拉德的回答几乎是正确的。重要的是某处有一个名为 :: 的对象。它实现了 unapply方法,返回类型 Option[(A, List[A])] .因此:

object :: {
  def unapply[A](ls: List[A]): Option[(A, A)] = {
    if (ls.empty) None
    else Some((ls.head, ls.tail))
  }
}

// case objects get unapply for free
case object Nil extends List[Nothing]

::的情况下和 List ,这个对象恰好来自::是扩展 List 的案例类特征。但是,如上例所示,它根本不必是 case 类。

关于list - 中缀运算符上的Scala匹配分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1022218/

相关文章:

python - 为文件夹中的文件生成字典元素列表

python - 如何在python中将每对列表转换为元组

python - 按最大重叠百分比和值过滤整数范围列表

scala - 我希望我的函数返回 Stream[T],但我不知道如何进行类型检查

javascript - 在大循环 : . indexOf(str) 或 .match(regex) 中使用什么具有更高的性能?

c - 即使数组编号匹配,它仍然返回 false

mysql - SQL查询匹配别名和排序依据并优化查询

python - 我正在尝试对元组列表实现选择排序

scala - Akka - 我什么时候应该使用 Bootable 类

scala - 如何使用 Scala 将数据作为元组传递到 Spark 中的 rdd