Scala允许使用这种提取器吗?

Scala允许使用这种提取器吗?,scala,unapply,Scala,Unapply,假设我有这个收藏: val a = Array(Array(1,2,3,4,5),Array(4,5),Array(5),Array(1,2,6,7,8)) 有没有一种方法可以定义一个提取器,其工作方式如下: a.foreach(e => { e match { case Array( ending with 5 ) => case _ => } }) 对不起,伪代码,但我不知道如何表达它。有没有办法匹配最后一个元素是5的东西?如果我想

假设我有这个收藏:

val a = Array(Array(1,2,3,4,5),Array(4,5),Array(5),Array(1,2,6,7,8))
有没有一种方法可以定义一个提取器,其工作方式如下:

a.foreach(e => {
   e match {
      case Array( ending with 5 ) => 
      case _ =>
   }
})
对不起,伪代码,但我不知道如何表达它。有没有办法匹配最后一个元素是5的东西?如果我想匹配第一个元素是1,最后一个元素是5,该怎么办?这是否适用于不同长度的数组(请注意,在示例中,我专门为数组选择了不同的长度)

谢谢

a.foreach(e => {
   e match {
      case a: Array[Int] if a.last == 5 => 
      case _ =>
   }
})
您可以做一些更好的事情来匹配第一个元素:

a.foreach(e => {
   e match {
      case Array(1, _*) => 
      case _ => 
   }
})
不幸的是,
@*
必须是数组参数列表中的最后一项。但是你可以在那之前让匹配变得复杂

scala> val Array(1, x @_*) = Array(1,2,3,4,5)
x: Seq[Int] = Vector(2, 3, 4, 5)

scala> val Array(1, b, 3, x @_*) = Array(1,2,3,4,5)
b: Int = 2
x: Seq[Int] = Vector(4, 5)

case
语法支持
if
s,因此可以:

a foreach {
  case a: Array[Int] if a.last == 5 =>
  case _ =>
}
是的,你可以:

object EndsWith {
  def unapply[A]( xs: Array[A] ) = 
    if( xs.nonEmpty ) Some( xs.last ) else None
}
以你为例:

val a = Array(Array(1,2,3,4,5),Array(4,5),Array(5),Array(1,2,6,7,8))

a foreach { 
  case e @ EndsWith(5) => println( e.mkString("(",",",")" ) )
  case _ =>
}
它按预期打印
(1,2,3,4,5)
(4,5)
(5)

使用相同的方法,您可以编写一个提取器
StartWith
,然后添加一个方法将它们组合到一个新的提取器中,以匹配这两个条件

a.foreach (ar => ar.last match {                    
  case 5 => println ("-> 5] " + ar.mkString ("~"))
  case _ => println ("   ?] " + ar.mkString (":")) }) 
为什么不直接匹配最后一个元素

-> 5] 1~2~3~4~5
-> 5] 4~5
-> 5] 5
   ?] 1:2:6:7:8

.*
绑定到
x
有什么意义?更重要的是,Jean-Philippe Pellet对
.
?@Jean-Philippe说:海报没有说明数组内容是否确实需要。如果需要它们,那么将它们绑定到一个变量可以让您使用它们。@Jean-Philippe Pellet:the
\uuuz
上的调用很好;我不知道你可以自己做
。*
。谢谢。这是非常密切相关的:尽量避免通过提取器解构数组,它们以O(n)复杂度循环/复制到Seq。提取器就是这样做的。