Geo*_*Geo 6 functional-programming scala pattern-matching
我试图创建一个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")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Eclipse说wrong number of arguments for object NumberMatcher.这是为什么?
如果你想要退货unapply,请将其归还Some.Boolean如果可以匹配则返回测试.
以下是模式匹配的翻译方式:
str match {
case NumberMatcher(group) => println(group)
case _ => println("no")
}
Run Code Online (Sandbox Code Playgroud)
假设NumberMatcher返回Option[...],它将执行:
val r1 = NumberMatcher.unapply(str)
if (r1 != None) {
val group = r1.get
println(group)
} else {
println("no")
}
Run Code Online (Sandbox Code Playgroud)
如果NumberMatcher返回布尔值,那么你可以让它收到一些东西.在这种情况下,这是发生的事情:
str match {
case NumberMatcher() => println("yes")
case _ => println("no")
}
Run Code Online (Sandbox Code Playgroud)
变
val r1 = NumberMatcher.unapply(str)
if (r1) {
println("yes")
} else {
println("no")
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个非常肤浅的解释.大小写匹配可以测试常量,有额外的保护条件,替代方案,unapply递归使用unapplySeq,使用等.这里我只展示了解决特定问题的非常基本的用法.我强烈建议搜索模式匹配的更全面的解释.