您的位置:首页 > 其它

样本类和模式匹配

2015-12-09 22:10 381 查看

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

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

样本类:
简单样本类例子:
sealed
abstract
class
Expr {
def
name:String
[align=left]}[/align]
case
class
Var(exprName:String)
extends
Expr{def
name
:String
=
"Var"}
case
class
Number(num:Double)
extends
Expr{
def
name
:String
=
"Number"}
case
class
UnOp(operator:String,
arg:Expr)
extends
Expr{def
name
:String
=
"UnOp"}
case
class
BinOp(operator:String,
left:Expr,
right:Expr){
def
name
: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。
例如:
val
captional
=
Map(1->
2,
2->3
,3->4)
println(captional
get
3)
输出的是:
[align=left]Some(4)[/align]
定义一个 函数 用来分离可选值:
val
withDefault:Option[Int]=>Int={
case
Some(x)
=>
x
case
None
=>
0
[align=left]}[/align]
println(withDefault(captional
get
3))
输出: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]) {
def
caseclass_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" )

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: