匹配Scala中列表的第n个元素

enh*_*ull 8 scala

将值与列表的第n个元素匹配的最佳Scala习惯用法是什么?

天真的方法显然不起作用:

scala> val list = List(5,6,7)
list: List[Int] = List(5, 6, 7)

scala> val x = 7
x: Int = 7

scala> x match { case list(2) => true; case _ => false }
<console>:10: error: value list is not a case class constructor, nor does it have an       unapply/unapplySeq method
   x match { case list(2) => true; case _ => false }
Run Code Online (Sandbox Code Playgroud)

为了澄清 - 这个问题不是关于如何将值与列表的第n个元素进行比较 - 具体是关于是否可以使用匹配来完成.

Ale*_*ise 17

看哪,实例提取器的力量!(Regexstdlib中的类工作方式相似)

case class Nth[A](which: Int) {
  def unapply(in: List[A]): Option[A] = if (in.size >= which+1) Some(in(which)) else None
}

val second = Nth[Int](1)

List(2,4,6) match {
  case second(4) => println("yep!")
  case x => println("nope!")
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的提取器示例,IMO,虽然可能一次性过于冗长.如果只有一种方法可以在不编写自定义提取器的情况下执行此操作. (2认同)