1

为什么提取器返回时我不能以@样式绑定变量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
  }
}

然后第一个示例有效,而第二个示例无效!为什么会这样?

4

2 回答 2

8

什么?“对象 IsUpperCase 的参数数量错误”?

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

嗯,是。unapplyis的返回类型Option[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().

于 2012-07-01T17:49:19.057 回答
5

因为对于第一个示例,您需要编写类似case u @ IsUpperCase(v) =>orcase u @ IsUpperCase(_) =>的内容,这意味着“匹配IsUpperCase(v)并且如果成功将原始字符串绑定到u”。

于 2012-07-01T17:33:49.590 回答