模式匹配是类似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类才是有意义的
现在体会不多,,,,,,