使用案例类和提取器对象列出分解

时间:2016-10-06 14:21:08

标签: scala pattern-matching

我创建了一个列表,如下所示

List (1, 2, 3, 4)
res4: List[Int] = List(1, 2, 3, 4)

有了这个,如果我进行模式匹配,如下所示

res4 match {
     case ::(head, tail) => println (head); println(tail);
     }

给了我:

1
List(2, 3, 4)

这是预料之中的。接下来,如果我尝试以下作为提取器对象

(::)(2, List(3, 4))

给了我:

res6: scala.collection.immutable.::[Int] = List(2, 3, 4)

到目前为止没有问题。接下来,如果我尝试以下操作:

res4 match {
  case :+(head, tail) => println (head); println(tail);
}

我得到了

List(1, 2, 3)
4

仍然没有问题。现在,如果尝试:+ extractor对象,请按以下方式:

(:+)(List(1, 2), 3)

我收到以下错误:

<console>:12: error: scala.collection.:+.type does not take parameters
   (:+)(List(1, 2), 3)

这可能是什么问题?有没有:+定义了提取器对象?如果不是,那么它如何在模式匹配中起作用?

1 个答案:

答案 0 :(得分:1)

  

这可能是什么问题?没有:+定义了提取器对象   ?如果不是,那么它如何在模式匹配中起作用?

问题是:+对象支持unapply方法,该方法用于提取器模式在模式匹配中工作,但不支持apply方法:

/** An extractor used to init/last deconstruct sequences. */
object :+ {
  /** Splits a sequence into init :+ tail.
   * @return Some((init, tail)) if sequence is non-empty. None otherwise.
   */
  def unapply[T,Coll <: SeqLike[T, Coll]](
      t: Coll with SeqLike[T, Coll]): Option[(Coll, T)] =
    if(t.isEmpty) None
    else Some(t.init -> t.last)
}

因此,您会收到编译时错误。当你考虑它时,这是有道理的,:+申请的结果应该是什么?