浅谈Scala模式匹配
一.scala模式匹配(patternmatching)
patternmatching可以说是scala中十分强大的一个语言特性,当然这不是scala独有的,但这不妨碍它成为scala的语言的一大利器。
scala的patternmatching是类似这样的,
ematch{ casePattern1=>doSomething casePattern2if-clause=>doothers ... }
其中,变量e后面接一个match以及一个代码块,其中每个case对应一种可能回匹配的类型,如果匹配成功则执行=>后面的代码。
我们可以用一个具体一些的例子来看看模式匹配是怎么工作的:
caseclassPlayer(name:String,score:Int) defprintMessage(player:Player)=playermatch{ casePlayer(_,score)ifscore>100000=> println("Getajob,dude!") casePlayer(name,_)=> println("Hey,$name,nicetoseeyouagain!") }
看起来有点类似于其他语言的switch,但其实还是有很大的不同的。
以java的switch为例,java的switch仅仅会做一些基本类型的匹配,然后执行一些动作,并且是没有返回值的。
而scala的patternmatchingmatch则要强大得多,除了可以匹配数值,同时它还能匹配类型。
defparseArgument(arg:String)=argmatch{ //匹配值 case"-h"|"--help"=>displayHelp case"-v"|"--version"=>displayVerion casewhatever=>unknownArgument(whatever) }
deff(x:Any):String=xmatch{ //匹配类型 casei:Int=>"integer:"+i case_:Double=>"adouble" cases:String=>"Iwanttosay"+s }
同时patternmatching是有返回值的,比如上面的match,它返回的就是一个Unit。我们也可以修改上面的代码让它返回一个字符串:
caseclassPlayer(name:String,score:Int) defmessage(player:Player)=playermatch{ casePlayer(_,score)ifscore>100000=> "Getajob,dude!" casePlayer(name,_)=> "Hey,$name,nicetoseeyouagain!" }
值得一提的是,patternmatching返回值是由第一个匹配的模式中的代码块决定的。
二.为什么要用patternmatching
看到这里你会发现一个问题,patternmatching不是和ifelse差不多吗?那为什么还要使用patternmatching呢?
首先我们需要明白,模式匹配其实本质上是提供一个方便的解构(Destructuring)数据结构的方式,以scala为例,patternmatching其实用到了scala中提取器的功能,提取器其实就是类中的unapply()方法。
traitUser{ defname:String } classFreeUser(valname:String)extendsUser objectFreeUser{ //提取器 defunapply(user:FreeUser):Option[String]=Some(user.name) }
valuser:User=newFreeUser("Daniel") usermatch{ caseFreeUser(name)=>println("itmatchhere"+name) case_=>println("notme") }
明白了模式匹配的本质你就会直到,其实ifelse只是patternmatching中的一个典型的用法,但并非它的全部。
同时,patternmatching允许你解耦两个并不真正属于彼此的东西,也使得你的代码更易于测试。比如上面的match部分的代码我们可以写成下面这样:
valuser:User=newFreeUser("Daniel") //将返回结果存在一个常量中 valmessage=usermatch{ caseFreeUser(name)=>"itmatchhere"+name case_=>"notme" } //可以随意使用该常量,实现解耦 println(message)
这样会赋予代码更多的灵活性,同时也更加方便做进一步操作。
而以可读性的角度来说,使用一大堆的ifelse代码无疑是比较难看的,而如果使用patternmatching的话,代码会简洁清晰很多,而简洁的代码则会更容易阅读。
以上就是浅谈Scala模式匹配的详细内容,更多关于scala模式匹配的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。