为什么这些scala模式匹配提取器调用有效语法?

时间:2012-03-20 11:10:05

标签: scala pattern-matching

TL;博士;这是因为中缀运算符,与提取器无关

我一直在使用scala中的提取器,并发现以下两种情况都是有效的语法有点令人费解的事实?!发生了什么?

class Foo(val items:List[String], val number:Int)

object FooEnough {
  def unapply(f:Foo):Option[(List[String], Int)] = if(f.number > 2) Some(f.items, f.number) else None
}

val foo = new Foo("a" :: "b" :: "c" :: Nil, 3)
val matches:String = foo match {
  case FooEnough("a" :: "b" :: "c" :: Nil, 3) => "first case"
  case "a" :: "b" :: "c" :: Nil FooEnough 4 => "second case"
}
//matches == "first case"

如果我创建另一个提取3个参数的提取器,我打算如何使用上面第二种情况中的语法来调用它?

object FooSpectrum {
  def unapply(f:Foo):Option[(String, List[String], Int)] =
    if(f.number > 2) Some("zx", f.items, f.number) else None
}

foo match {
  case FooSpectrum("zx", "a" :: "b" :: "c" :: Nil, 3) => "first case" //compiles
  case "zx" FooSpectrum "a" :: "b" :: "c" :: Nil 4 => "second case" //doesn't compile
}

1 个答案:

答案 0 :(得分:4)

这是因为中间操作符魔术scala提供的。您也可以写String Map Int而不是Map[String,Int]。这仅适用于二进制类型/函数,因为它对2个以上的args没有意义,也很难解析。