9.2 匹配通配符

在上面的例子里,我们并没有处理day所有可能的值。如果有一个值,与case表达式里的任何一个都不匹配,会得到一个MatchError异常。把参数做成enum,而非String,就可以控制day的取值。即便如此,我们可能依然不想处理一周的每个日期。使用通配符,就可以避免抛出异常:

PatternMatching/Wildcard.scala

  1. object DayOfWeek extends Enumeration {
  2. val SUNDAY = Value("Sunday")
  3. val MONDAY = Value("Monday")
  4. val TUESDAY = Value("Tuesday")
  5. val WEDNESDAY = Value("Wednesday")
  6. val THURSDAY = Value("Thursday")
  7. val FRIDAY = Value("Friday")
  8. val SATURDAY = Value("Saturday")
  9. }
  10. def activity(day: DayOfWeek.Value) {
  11. day match {
  12. case DayOfWeek.SUNDAY => println("Eat, sleep, repeat...")
  13. case DayOfWeek.SATURDAY => println("Hangout with friends")
  14. case _ => println("...code for fun...")
  15. }
  16. }
  17. activity(DayOfWeek.SATURDAY)
  18. activity(DayOfWeek.MONDAY)

上面的代码里,为一周的日期定义了一个枚举。在Scala里可以使用Java的enum。不过用的时候就要像上面这样,从scala.Enumeration继承出一个单例对象。在activity()方法里,我们匹配了SUNDAYSATURDAY,用通配符(由下划线(_)表示)处理剩下的日期。

运行这段代码,先匹配SATURDAY,接着由通配符匹配MONDAY

  1. Hangout with friends
  2. ...code for fun...