我试图创建一个用于模式匹配的unapply方法,并试图让它返回一些不同于Option的东西,但是,Eclipse将其显示为一个错误。unapply必须返回Option[T]是规则吗?
编辑:这是我尝试使用的代码。我更改了上一节中的代码,以便unapply返回一个布尔值
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。为什么会这样呢?
发布于 2009-12-15 05:48:08
如果你想用unapply返回一些东西,在Some内部返回它。返回Boolean只是测试是否可以匹配。
以下是模式匹配的转换方式:
str match {
case NumberMatcher(group) => println(group)
case _ => println("no")
}假设NumberMatcher返回Option[...],它将执行以下操作:
val r1 = NumberMatcher.unapply(str)
if (r1 != None) {
val group = r1.get
println(group)
} else {
println("no")
}如果NumberMatcher返回Boolean,那么您可以让它接收一些东西。在这种情况下,将会发生以下情况:
str match {
case NumberMatcher() => println("yes")
case _ => println("no")
}变成了
val r1 = NumberMatcher.unapply(str)
if (r1) {
println("yes")
} else {
println("no")
}请注意,这是一个非常肤浅的解释。大小写匹配可以测试常量,有额外的保护条件,可选的,递归地使用unapply,使用unapplySeq等等。在这里,我只展示解决特定问题的非常基本的用法。我强烈建议搜索模式匹配的更全面的解释。
发布于 2009-12-15 04:44:04
再看一遍这个example。我引用一下
取消应用的返回类型选择如下:
*如果只是一个测试,返回一个布尔值。例如,case even()
*如果返回T类型的单个子值,则返回OptionT
*如果要返回多个子值T1,...,Tn,请将它们分组到一个可选的元组选项(T1,...,Tn)中。
发布于 2009-12-15 06:11:51
当您定义unapply以返回Boolean时,您表示该模式没有任何要匹配(或绑定)的通配符。因此,这个解压函数的case语句应该是case NumberMatcher => println(str),并且给它一个变量来填充是错误的。
或者,要创建case NumberMatcher(group) => println(group),您需要定义返回Option[String]的unapply()
https://stackoverflow.com/questions/1903341
复制相似问题