样本类和模式匹配
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可以将类放在中间进行模式匹配。 |
在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" )
}
}
}
相关文章推荐
- Shortest Palindrome
- Git和Github的配合使用
- 使用配置hadoop中常用的Linux(ubuntu)命令
- Hibernate的catalog导致数据库连接与实际操作的库不一致
- gevent关闭socket操作
- AppStore 提交的更新包一直显示"正在处理"
- 搞定HTML\CSS之absolute和relative
- 常用trait和特殊类
- 超越kmeans:聚类算法概述
- 设备驱动的艺术之旅 - 无处不在的字符设备<一>
- 侧滑面板(对viewGroup的自定义)
- 侧滑面板(对viewGroup的自定义)
- vim下解决ctrl-s ctrl-q 假死问题
- 侧滑面板(对viewGroup的自定义)
- 毕设js随笔
- 快乐大本营项目总结
- CentOS6.4之图解SSH无验证双向登陆配置
- 【bzoj4352】 Tower
- _WorldSpaceLightPos0的w值
- scala指令