Scala课堂(6):基础(五)

jerry Scala 2015年11月25日 收藏

这里我们转载Twitter的Scala课堂  ,转载的内容基本来自Twitter的Scala课堂中文翻译,部分有小改动.

模式匹配
这是Scala中最有用的部分之一。
匹配值

  1. scala> val times = 1
  2. times: Int = 1
  3.  
  4. scala>
  5.  
  6. scala> times match {
  7. | case 1 => "one"
  8. | case 2 => "two"
  9. | case _ => "some other number"
  10. | }
  11. res4: String = one
  12.  

添加条件进行匹配

  1. scala> times match {
  2. | case i if i == 1 => "one"
  3. | case i if i == 2 => "two"
  4. | case _ => "some other number"
  5. | }
  6. res5: String = one
  7.  

注意我们是怎样将值赋给变量’i’的。

在最后一行指令中的_是一个通配符;它保证了我们可以处理所有的情况。
否则当传进一个不能被匹配的数字的时候,你将获得一个运行时错误。我们以后会继续讨论这个话题的。

匹配类型
你可以使用 match来分别处理不同类型的值

  1. def bigger(o: Any): Any = {
  2. o match {
  3. case i: Int if i < 0 => i - 1
  4. case i: Int => i + 1
  5. case d: Double if d < 0.0 => d - 0.1
  6. case d: Double => d + 0.1
  7. case text: String => text + "s"
  8. }
  9. }

匹配类成员
还记得我们之前的计算器吗。
让我们通过类型对它们进行分类。
一开始会很痛苦

  1. def calcType(calc: Calculator) = calc match {
  2. case _ if calc.brand == "hp" && calc.model == "20B" => "financial"
  3. case _ if calc.brand == "hp" && calc.model == "48G" => "scientific"
  4. case _ if calc.brand == "hp" && calc.model == "30B" => "business"
  5. case _ => "unknown"
  6. }

(⊙o⊙)哦,太痛苦了。幸好Scala提供了一些应对这种情况的有效工具。

样本类 Case Classes
使用样本类可以方便得存储和匹配类的内容。你不用new关键字就可以创建它们。

  1. scala> case class Calculator(brand: String, model: String)
  2. defined class Calculator
  3.  
  4. scala> val hp20b = Calculator("hp", "20b")
  5. hp20b: Calculator = Calculator(hp,20b)
  6.  

样本类基于构造函数的参数,自动地实现了相等性和易读的toString方法。

  1. scala> val hp20b = Calculator("hp", "20b")
  2. hp20b: Calculator = Calculator(hp,20b)
  3.  
  4. scala> val hp20B = Calculator("hp", "20b")
  5. hp20B: Calculator = Calculator(hp,20b)
  6.  
  7. scala> hp20b == hp20B
  8. res6: Boolean = true
  9.  

样本类也可以像普通类那样拥有方法。
使用样本类进行模式匹配
case classes are designed to be used with pattern matching. Let’s simplify our calculator classifier example from earlier.
样本类就是被设计用在模式匹配中的。让我们简化之前的计算器分类器的例子。

  1. val hp20b = Calculator("hp", "20B")
  2. val hp30b = Calculator("hp", "30B")
  3.  
  4. def calcType(calc: Calculator) = calc match {
  5. case Calculator("hp", "20B") => "financial"
  6. case Calculator("hp", "48G") => "scientific"
  7. case Calculator("hp", "30B") => "business"
  8. case Calculator(ourBrand, ourModel) => "Calculator: %s %s is of unknown type".format(ourBrand, ourModel)
  9. }

最后一句也可以这样写

  1. case Calculator(_, _) => "Calculator of unknown type"

或者我们完全可以不将匹配对象指定为Calculator类型

  1. case _ => "Calculator of unknown type"

或者我们也可以将匹配的值重新命名。

  1. case c@Calculator(_, _) => "Calculator: %s of unknown type".format(c)