Scala 使用case/Match或if/else匹配空列表?
是否有任何理由认为应该使用case/match而不是if/else来匹配空列表,而不是样式?例如:Scala 使用case/Match或if/else匹配空列表?,scala,pattern-matching,Scala,Pattern Matching,是否有任何理由认为应该使用case/match而不是if/else来匹配空列表,而不是样式?例如: val a: List def compute: Int = if (a.isEmpty) 0 else a.sum 对 def compute: Int = a match { case Nil => 0 case _ => a.sum // This is bad. For sake of illustration only. } 如果您只
val a: List
def compute: Int =
if (a.isEmpty) 0
else a.sum
对
def compute: Int =
a match {
case Nil => 0
case _ => a.sum // This is bad. For sake of illustration only.
}
如果您只是测试empty/notempty,那么没有什么可供选择的,If可能更有意义。当有多个选项时,match进入游戏:
a match {
case Nil => 0
case hd::Nil => 1
case hd::tl => 2
}
通常情况下,您可以通过使用适当的方法避免或至少推迟此测试。例如,take1在空列表上工作,而head将失败。和头选项。地图。。。可以用来安全地处理第一个元素,如果存在的话。蒂姆已经有了一个很好的答案,但我想用一个稍微不同的角度 对于列表或其他集合,.head和.tail是不安全的,如果不小心在错误的分支中使用它们,或者根本忘记测试,那么case就不需要调用这些函数
如果您的函数不需要调用它们,也不需要检查更复杂的条件,那么您也可以使用If。在这种情况下,.sum在空列表中已经有您想要的行为,所以您可以直接调用它。@BrianMcCutchon Right。正如我所说的那样。这只是一个例子,所以我听到的是,如果我所关心的只是一个列表的空或非空,那么if就足够了。谢谢