枚举通常用来定义已知数量的常量,比如月份,星期,季节等等,用过java的人都知道定义枚举的关键字是enum,在scala里面和java有所不同,来看一个完整的例子定义:
object EnumTest { /*** * 定义一个星期的枚举 */ object WeekDay extends Enumeration{ type WeekDay = Value //声明枚举对外暴露的变量类型 val Mon = Value("1") val Tue = Value("2") val Wed = Value("3") val Thu = Value("4") val Fri = Value("5") val Sat = Value("6") val Sun = Value("7") def checkExists(day:String) = this.values.exists(_.toString==day) //检测是否存在此枚举值 def isWorkingDay(day:WeekDay) = ! ( day==Sat || day == Sun) //判断是否是工作日 def showAll = this.values.foreach(println) // 打印所有的枚举值 } def main(args: Array[String]): Unit = { println(WeekDay.checkExists("8"))//检测是否存在 println(WeekDay.Sun==WeekDay.withName("7"))//正确的使用方法 println(WeekDay.Sun=="7")//错误的使用方法 WeekDay.showAll //打印所有的枚举值 println(WeekDay.isWorkingDay(WeekDay.Sun)) //是否是工作日 } }
上面的这个例子基本涵盖了枚举的所有常用方法,定义枚举我们继承的是Enumeration抽象类,然后通过内部对象Value来赋值每一个枚举的值,此外里面还定义了几个工具方法,比如判断是否存在某个枚举,是否是工作日,以及打印所有的枚举值,在使用的时候可以直接通过Object来访问 。
此外还可以用枚举值做模式匹配:
val weekDay=WeekDay.Sun weekDay match { case WeekDay.Mon=> println("星期一") case WeekDay.Tue=> println("星期二") case WeekDay.Wed=> println("星期三") case WeekDay.Thu=> println("星期四") case WeekDay.Fri=> println("星期五") case WeekDay.Sat=> println("星期六") case WeekDay.Sun=> println("星期日") }
object Enumerationops { def main(args: Array[String]): Unit = { val weekDay=WeekDay.Sun CalWeekDay(weekDay) } def CalWeekDay(day:WeekDay.Value):Unit = { day match { case WeekDay.Mon=> println("星期一") case WeekDay.Tue=> println("星期二") case WeekDay.Wed=> println("星期三") case WeekDay.Thu=> println("星期四") case WeekDay.Fri=> println("星期五") case WeekDay.Sat=> println("星期六") case WeekDay.Sun=> println("星期日") } } object WeekDay extends Enumeration{ type WeekDay = Value //声明枚举对外暴露的变量类型 val Mon = Value("1") val Tue = Value("2") val Wed = Value("3") val Thu = Value("4") val Fri = Value("5") val Sat = Value("6") val Sun = Value("7") def checkExists(day:String) = this.values.exists(_.toString==day) //检测是否存在此枚举值 def isWorkingDay(day:WeekDay) = ! ( day==Sat || day == Sun) //判断是否是工作日 def showAll = this.values.foreach(println) // 打印所有的枚举值 } }
记住:CalWeekDay(day:WeekDay.Value) 参数类型是WeekDay.Value