模式匹配和样例类

时间:2022-10-09 05:49:14

模式匹配是类似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类才是有意义的

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