阶模式匹配可变结合(Scala pattern matching variable binding)

2019-10-16 22:15发布

为什么不能结合在@样式可变时提取返回Option[<Type>] 即此一不工作:

object IsUpperCase {
  def unapply(s: String): Option[String] = {
    if (s.toUpperCase() == s) {
      Some(s)
    } else {
      None
    }
  }
}

val s = "DuDu@qwadasd.ru"
s match {
  case u @ IsUpperCase() => println("gotcha!") // what? "wrong number of arguments for object IsUpperCase"?
  case _ => 
}

但是这一次的作品!

val s = "DuDu@qwadasd.ru"
s match {
  case IsUpperCase(u) => println("gotcha!")
  case _ => 
}

从另一方面,如果IsUpperCase看起来是这样的:

object IsUpperCase {
  def unapply(s: String): Boolean = {
    return s.toUpperCase() == s
  }
}

然后第一个示例,第二不! 为什么是这样?

Answer 1:

什么? “错号码为对象IsUpperCase参数”?

case u @ IsUpperCase() => println("gotcha!")

嗯,是。 的返回类型unapplyOption[String] ,这意味着所述图案匹配IsUpperCase 必须接受的参数,如下所示:

case u @ IsUpperCase(_) => println("gotcha!") // I don't care about the parameter

unapply适合的第一图案的定义是这样的:

object IsUpperCase {
  def unapply(s: String): Boolean = s.toUpperCase() == s
}

这可以被用于图案匹配针对IsUpperCase()



Answer 2:

因为对于第一个例子,你需要写类似case u @ IsUpperCase(v) =>case u @ IsUpperCase(_) =>意思是“匹配IsUpperCase(v)如果它成功了原始的字符串绑定到u ” 。



文章来源: Scala pattern matching variable binding