scala switch case逻辑,其他日期在这段代码中意味着什么

时间:2014-09-25 02:50:24

标签: scala

days match {
  case firstDay :: otherDays =>
    println("The first day of the week is: " + firstDay)
  case List() =>
    println("There don't seem to be any week days.")
}

在此代码中," otherDays"意思? 如何理解这种开关案例逻辑?

感谢

2 个答案:

答案 0 :(得分:5)

这本身并不是一个开关。在Scala中,它被称为模式匹配。在您的示例中,days与2个案例进行匹配。虽然您没有提供days变量的类型,但它可能是List

如果您的列表非空,那么它将与第一个案例匹配:case firstDay :: otherDays并且将被解构或未应用到两个变量head :: tail中。 ::“运算符”通过将左侧的元素添加到右侧的列表来构造列表。在你的情况下,它用于解构列表。基本上它看起来像这样:::(head, tail)将成为::.unapply(selector)的调用,其中::是一个对象而unapply有这样的签名:

def unapply[A](value: List[A]): Option[(A, List[A])]

所以最后在列表中调用unapply,如果列表不为空,则返回Some的头部和尾部,否则为None。 Scala会自动转换Option以匹配您的模式匹配中的右case

请注意,此表达式的结果类型为Unit,并且它不是FP样式。您可以将其更改为:

val res =
days match {
  case firstDay :: otherDays =>
    "The first day of the week is: " + firstDay
  case List() =>
    "There don't seem to be any week days."
}
println(res)

更具功能性。在这种情况下,返回类型将为String,并且您将副作用推迟到最后(更可测试)。

答案 1 :(得分:2)

看起来days只有List天。第一种情况是列表的解构,其中firstDay是列表的头部,otherDays是列表的尾部或“休息”。

第一种情况将匹配任何非空列表,而第二种情况将匹配空列表。