样本类和模式匹配

来源:互联网 发布:工作站品牌 知乎 编辑:程序博客网 时间:2024/04/30 12:52

scala中的match语句类似于其他语言的switch

java中的switch语法为:
switch{选择器}{备选项}
scala中的match语法:
选择器 match {备选项}
例子:
defint2String(x:Int):String=
xmatch{
case0=>"This is 0"
case1=>"This is 1"
case_ =>"This is other number"
}
在match语法中,case后面不用加break,case执行完一句就会退出了。match除了上面用到的常量模式之外,还有很多种其他的匹配模式,scala的模式匹配可以有变量模式、构造器模式、序列模式、元组模式和类型模式。

样本类:
简单样本类例子:
sealedabstractclassExpr {
defname:String
}
caseclassVar(exprName:String)extendsExpr{defname:String="Var"}
caseclassNumber(num:Double)extendsExpr{defname:String="Number"}
caseclassUnOp(operator:String,arg:Expr)extendsExpr{defname:String="UnOp"}
caseclassBinOp(operator:String,left:Expr,right:Expr){defname:String="BinOp"}
关键字sealed可以不添加,添加了sealed这个关键字后,Expr成为一个封闭类,不能在case外再定义Expr的子类。
上述带case 关键字的类称之为样本类,样本类有一些便捷的设定,
1.它会添加与类名一致的工厂方法
2.样本类参数列表中的所有参数会隐式的获得val前缀,因此它会被当做字段维护。
3.编译器为你的类添加了方法toString、hashCode和equals的“自然”实现。

Option类型
Scala中为可选值定义了异种Option的标准类型。这种值可以有两种形式。可以使Some(x)的形式,其中x是实际值,或者也可以是None对象,代表缺失值。
scala集合类型在某些标准操作会产生可选值。例如,Scala的Map的get方法会在发现了指定键的情况下产生Some(Value),在没有找到指定键的时候产生None。
例如:
valcaptional=Map(1->2,2->3,3->4)
println(captionalget3)
输出的是:
Some(4)
定义一个 函数 用来分离可选值:
valwithDefault:Option[Int]=>Int={
caseSome(x) => x
caseNone=>0
}
println(withDefault(captionalget3))
输出:4


case class用法:
case class定义了之后会自动定义本身的object类型,并且会定义几个函数。看下面的case class中自带的函数使用
abstract class Person
case class Student(age:Int) extends Person
case class Worker(age:Int,salary:Double)extends Person
case object Shared extends Person

object case_class_object {

def main(args: Array[String]) {
val worker = Worker(29,100000.1)
val worker2 = worker.copy(salary =19.95)
val worker3 = worker.copy(age =30)
println(worker) //Worker(29,100000.1)
println(worker2)//Worker(29,19.95)
println(worker3)//Worker(30,100000.1)
println(worker.productElement(1))//100000.1
println(worker.productPrefix)//Worker
}
}
case class可以做多重镶嵌:
abstract class Item
case class Book(description :String, price : Double) extends Item
case class Bundle(description :String, price : Double, item: Item*)extends Item

class Pattern_Match_Case_Class_Nested {

def main(args: Array[String]) {
defcaseclass_nested(person: Item) = person match {
case Bundle(_,_,art @Book(_,_),rest @ _*)=> println(art.description + ":" + art.price)
// case Bundle(_,_,Book(desc,_),_*) =>println(desc)
case _ => println("Oops!")
}
}
}
注意上面的“@”是一个特殊的用法。
中置表达:
例子:
case class Cons(first:String,second:String)
val case_class = Cons("one", "two")
case_class match { case"one" Cons"two" => println("Spark!!!") } //unapply
上面的代码中,黄底的地方可以看到,带两个值得case class可以将类放在中间进行模式匹配。



偏函数PartialFunction[-A,+B]
在scala很多框架的代码中,会看到以下的语法:
param {
case ... => ....
}
类似这样的语法使用,这里就是定义了一个param方法,带参数PartialFunction,就可以使用以上的语法。
例如:Actor中的receive方法:
代码示例:
def receive[A](f: PartialFunction[Any,A]): A =
self.receive(f)
使用:
val double_Message = actor{
while(true){
receive {
case msg : Double => println("Double Number from inbox: " + msg)
// case _ => println("Something Unkown" )
}
}
}


0 0
原创粉丝点击