繁体   English   中英

Scala模式匹配变量绑定

[英]Scala pattern matching variable binding

当提取程序返回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
  }
}

然后第一个示例可行,而第二个示例不可行! 为什么这样呢?

什么? “对象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()进行模式匹配。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM