Scala 模式匹配变量绑定(bind)

标签 scala extractor

当提取器返回 Option[<Type>] 时,为什么我不能以@-style 的方式绑定(bind)变量? IE。这个不行:

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
  }
}

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

最佳答案

what? "wrong number of arguments for object IsUpperCase"?

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

嗯,是的。 unapply的返回类型是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() 进行模式匹配。

关于Scala 模式匹配变量绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11284048/

相关文章:

java - 从在 R 中创建的 pmml 在 Scala/Java 中加载模型

python - 如何让 python 加载正确的库(.dylib,而不是 OSX 上的 .so.3)

java - Scala 编译器不使用 case 类的 unapply 方法进行模式匹配,这是为什么呢?

python - Scrapy 抓取提取的链接

java - 如何在 Scala 中子类化 Exception

scala - 为什么大写字母不能用于定义值的模式匹配?

scala - Spark 在 groupBy/aggregate 中合并/组合数组

scala - 将 Play 项目导入 IntelliJ 时出错

Scala Extractor unapply 调用了两次

json - JMeter JSON Extractor,提取字符串中一个键的所有值