码迷,mamicode.com
首页 > 其他好文 > 详细

模式匹配和样例类

时间:2015-05-15 01:19:14      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

模式匹配是类似switch-case特性,但更加灵活;也类似if-else,但更加简约。

 1 def fibonacci(i : Any) : Int = i match {
 2     case 0 => 0
 3     case 1 => 1
 4     case n : Int if (n > 1) => fibonacci(n -1) + fibonacci(n - 2)
 5     case _ => 0
 6 }
 7 
 8 println(fibonacci(3))
 9 println(fibonacci(-3))
10 println(fibonacci(2))

这个例子展示的使用用模式匹配实现斐波那契。

使用case来匹配参数,如果case _,则可以匹配任何参数。同时,可以使用守卫来进行判断,守卫是Boolean类型的

模式匹配也可以匹配类型,在case _ 前加上case n: String => fibonacci(n.toInt),这样就可以匹配String类型

样例类举例:

 1 abstract class Expr
 2 
 3 case class FibonacciExpr(n: Int) extends Expr {
 4   require(n >= 0)
 5 }
 6 
 7 case class SumExpr(a: Expr, b: Expr) extends Expr
 8 
 9 def value(in: Expr): Int = in match {
10   case FibonacciExpr(0) => 0
11   case FibonacciExpr(1) => 1
12   case FibonacciExpr(n) => 
13     value(SumExpr(FibonacciExpr(n - 1), FibonacciExpr(n - 2)))
14   case SumExpr(a, b) => value(a) + value(b)
15   case _ => 0
16 }
17 println(value(FibonacciExpr(3)))

样例类是特殊的类,被优化以被用于模式匹配。

样例类中的参数会被自动声明为val。

由于伴生对象提供apply方法,可不用new,就可以创建对象。

同时,自动生成equals,hascode,toString等方法。

有种说法:只有在分解数据结构的时候用到了模式匹配的情况下,定义case类才是有意义的

现在体会不多,,,,,,

 

                      

                        

模式匹配和样例类

标签:

原文地址:http://www.cnblogs.com/wlwgcdxc/p/4504887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!