标签:
模式匹配是类似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