实现模式匹配的类

时间:2010-05-24 20:56:17

标签: scala pattern-matching

例如,

val list = List(1,2,3)
list match {
  case a :: b => 
  case _      => 
}

您可以使用::或使用~的ParseResult标记来匹配列表的头部和尾部。我该怎么做才能创建可以像前面的类一样匹配的类?

UPD:

有可能写:

case class @ ...
List(1,2,3,4) match {
  case 1 @ 2 @ 3 @ 4 => 
}

2 个答案:

答案 0 :(得分:9)

没有太大的意义。这两个陈述是等价的:

case x :: xs =>
case ::(x, xs) =>

假设您想要将列表分成几率和平均值,并将其称为**。您可以像这样编写提取器:

object ** {
  def unapply(xs: List[Int]) = Some(xs partition (_ % 2 == 0))
}

scala> List(1,2,3) match {
     |   case evens ** odds => println("Evens: "+evens+"\nOdds: "+odds)
     | }
Evens: List(2)
Odds: List(1, 3)

答案 1 :(得分:3)

如果您将班级定义为case class,则可以像这样进行模式匹配。

如果要对类的构造函数以外的其他内容进行模式匹配,可以使用extractors来定义自定义模式。