【问题标题】:Implementing class for pattern matching模式匹配的实现类
【发布时间】:2010-05-24 20:56:17
【问题描述】:

例如,

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

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

更新:

并且有可能写:

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

【问题讨论】:

  • 我认为您的意思是 :: 而不是 :::
  • 对于您的 @ 示例,您可以使用 :: 代替:case 1 :: 2 :: 3 :: 4 :: Nil => ...
  • @absz 问题是如何创建像 :: 这样的类

标签: scala pattern-matching


【解决方案1】:

没什么大不了的。这两个语句是等价的:

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)

【讨论】:

    【解决方案2】:

    如果你将你的类定义为case class,它可以像这样进行模式匹配。

    如果你想在类的构造函数之外的东西上进行模式匹配,你可以使用extractors 来定义自定义模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2018-03-07
      • 2012-06-07
      相关资源
      最近更新 更多