我创建了一个列表,如下所示
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)
这可能是什么问题?有没有:+定义了提取器对象?如果不是,那么它如何在模式匹配中起作用?
答案 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)
}
因此,您会收到编译时错误。当你考虑它时,这是有道理的,:+
申请的结果应该是什么?