我可以按类和变量使用模式匹配吗?

时间:2014-08-24 23:33:38

标签: scala pattern-matching

考虑以下示例:

def combine(trees: List[CodeTree]): List[CodeTree] =
  if (trees.isEmpty || singleton(trees)) trees
  else trees match {
    case Leaf(cl, wl) :: Leaf(cr, wr) :: tail =>
      Fork(new Leaf(cl, wl), new Leaf(cr, wr), List(cl, cr), wl + wr) :: tail
  }

我想知道是否可以将两个Leaf实例捕获到变量中。我希望语法如下:

def combine(trees: List[CodeTree]): List[CodeTree] =
  if (trees.isEmpty || singleton(trees)) trees
  else trees match {
    case l: Leaf(cl, wl) :: r: Leaf(cr, wr) :: tail =>
      Fork(l, r, List(cl, cr), wl + wr) :: tail
  }

这实际上并没有编译,但我希望有类似的东西。

提前致谢!

1 个答案:

答案 0 :(得分:4)

你对类型使用冒号,所以你必须写这样的东西:

case (l: Leaf[???]) :: (r: Leaf[???]) :: tail =>

但是有一种匹配模式并同时提取它的方法,即使用" at"签名:

case (l @ Leaf(cl, wl)) :: (r @ Leaf(cr, wr)) :: tail =>

PS:我不知道在哪里需要括号,所以无论如何我都加了它们。