首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unapply总是返回一个选项,这是一个规则吗?

unapply总是返回一个选项,这是一个规则吗?
EN

Stack Overflow用户
提问于 2009-12-15 04:36:32
回答 4查看 1.9K关注 0票数 8

我试图创建一个用于模式匹配的unapply方法,并试图让它返回一些不同于Option的东西,但是,Eclipse将其显示为一个错误。unapply必须返回Option[T]是规则吗?

编辑:这是我尝试使用的代码。我更改了上一节中的代码,以便unapply返回一个布尔值

代码语言:javascript
复制
import java.util.regex._

object NumberMatcher {
  def apply(x:String):Boolean = {
    val pat = Pattern.compile("\\d+")
    val matcher = pat.matcher(x)
    return matcher.find
  }

  def unapply(x:String):Boolean = {
    val pat = Pattern.compile("\\d+")
    val matcher = pat.matcher(x)
    return matcher.find
  }
}

object x {
  def main(args : Array[String]) : Unit = {
    val strings = List("geo12","neo493","leo")
    for(val str <- strings) {
      str match {
        case NumberMatcher(group) => println(group)
        case _ => println ("no")
      }
    }
  }
}

Eclipse说是wrong number of arguments for object NumberMatcher。为什么会这样呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-15 05:48:08

如果你想用unapply返回一些东西,在Some内部返回它。返回Boolean只是测试是否可以匹配。

以下是模式匹配的转换方式:

代码语言:javascript
复制
str match { 
  case NumberMatcher(group) => println(group)
  case _ => println("no")
}

假设NumberMatcher返回Option[...],它将执行以下操作:

代码语言:javascript
复制
val r1 = NumberMatcher.unapply(str)
if (r1 != None) {
  val group = r1.get
  println(group)
} else {
  println("no")
}

如果NumberMatcher返回Boolean,那么您可以让它接收一些东西。在这种情况下,将会发生以下情况:

代码语言:javascript
复制
str match { 
  case NumberMatcher() => println("yes")
  case _ => println("no")
}

变成了

代码语言:javascript
复制
val r1 = NumberMatcher.unapply(str)
if (r1) {
  println("yes")
} else {
  println("no")
}

请注意,这是一个非常肤浅的解释。大小写匹配可以测试常量,有额外的保护条件,可选的,递归地使用unapply,使用unapplySeq等等。在这里,我只展示解决特定问题的非常基本的用法。我强烈建议搜索模式匹配的更全面的解释。

票数 11
EN

Stack Overflow用户

发布于 2009-12-15 04:44:04

再看一遍这个example。我引用一下

取消应用的返回类型选择如下:

*如果只是一个测试,返回一个布尔值。例如,case even()

*如果返回T类型的单个子值,则返回OptionT

*如果要返回多个子值T1,...,Tn,请将它们分组到一个可选的元组选项(T1,...,Tn)中。

票数 8
EN

Stack Overflow用户

发布于 2009-12-15 06:11:51

当您定义unapply以返回Boolean时,您表示该模式没有任何要匹配(或绑定)的通配符。因此,这个解压函数的case语句应该是case NumberMatcher => println(str),并且给它一个变量来填充是错误的。

或者,要创建case NumberMatcher(group) => println(group),您需要定义返回Option[String]unapply()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1903341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档