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"意思? 如何理解这种开关案例逻辑?
感谢
答案 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
是列表的尾部或“休息”。
第一种情况将匹配任何非空列表,而第二种情况将匹配空列表。