码迷,mamicode.com
首页 > Windows程序 > 详细

C#程序员的Scala之路第十章(模式匹配)

时间:2015-04-01 10:59:50      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

1.样本类

在类前面加入关键字case则该类就是样本类,样本类在实例化的时候,不用new关键字如下:

case class A()
object Hello extends App {
  val v = A  //使用样本类之后
  val b = new A
}

样本类的第二个好处是,他使你的类参数引式的获得val,如下:

case class A(name: String)
object Hello extends App {
  val a = A("name")
  println(a.name)
}

2.模式匹配

模式匹配是个很强大的功能,如下代码:

abstract class Base
case class A(name:String,age:Int) extends Base
case class B(age:Int,name:String) extends Base

object Hello extends App {
  def baseMatch(base: Base): String = base match{
    case A(value,21) => value
    case B(value,"name2") => value.toString
    case _=> null
  } 
  
  val a = A("name",21)
  val b = B(22,"name2")
  
  println(baseMatch(a))
  println(baseMatch(b))
}

关键在于case A(value,21) 与case B(value,"name2") 模式匹配能匹配对象里的值,

它与switch 的功能类似,但是比switch更多变化,他能直接匹配对象里的值,或者说直接匹配对象。

3.变量模式与常量模式

看下面代码:

object Hello extends App {
  def matchAny(expr : Any) =
    expr match{
    case 0=>"zero"
    case value => "value :" +value
  }
  println(matchAny(0))
  println(matchAny("123456"))
  println(matchAny(123456))
}

value采用的就是变量模式,0采用的就是常量模式

变量模式就是以变量自身为通配符,去匹配。

4.序列模式

如下代码:

object Hello extends App {
  def matchAny(expr: Any) =
    expr match {
      case List(0, 1, _, value) => value
      case _ => Nil
    }
  println(matchAny(0))
  println(matchAny(List(0, 1, 4, 5)))
  println(matchAny(List(0, 1, 3, 9)))
}

5.元组模式

如下代码:

object Hello extends App {

  def tupleAny(expr: Any) =
    expr match {
      case (a, b, c) => println("matched :" + a + b + c)
      case _ => Nil
    }

  tupleAny(("a", 1, 3.14))
}

6.类型模式

如下代码:

object Hello extends App {

  def typeMatch(value: Any) =
    value match {
      case x: String => x.length
      case map: Map[_, _] => map.size
      case _ => Nil
    }

  println(typeMatch("String"))
  println(typeMatch(Map(1 -> "a", 2 -> "b")))
}

 7.模式守卫

如下代码,在匹配表达式后在加上if语句:

object Hello extends App {
  def typeMatch(value: Any) =
    value match {
      case List(1,2,3,e @ _,y) if e == y => e
      case _ => false
    }
  println(typeMatch(List(1,2,3,5,5)))
}

 

更多请参考scala编程

C#程序员的Scala之路第十章(模式匹配)

标签:

原文地址:http://www.cnblogs.com/qugangf/p/4383154.html

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