有没有办法在Scala中指定与大小更大(或更小)或等于某个值的List匹配的模式?
例如,如果我想对3个或更小的所有列表应用相同的操作:
list match {
case Nil => op(list)
case x :: Nil => op(list)
case x :: y :: Nil => op(list)
case x :: y :: z :: Nil => op(list)
case x :: tail => other(list)
}
有没有办法将此减少到两个案例?
答案 0 :(得分:13)
是的,虽然您需要撤消案件的顺序:
list match {
case l @ (_ :: _ :: _ :: _) => other(l)
case l => op(l)
}
请注意,我已将新变量l
绑定到模式中的列表而不是引用list
,并且我在不需要时使用_
一个变量。我建议坚持这两种做法,但如果没有它们,答案就会完全相同。
答案 1 :(得分:11)
如果你坚持使用模式匹配(也许你想要包含更多匹配案例?),你可以使用保护条件:
list match {
case l if(l.size <= 3) => op(l)
case l => other(l)
}
答案 2 :(得分:6)
普通的旧if / else ??
出了什么问题if (list.length >= minimumLength)
longer(list)
else
shorter(list)
答案 3 :(得分:4)
你也可以这样做:
list.splitAt(len) match {
case (xs, Nil) => other(xs)
case (_, _) => op(list)
}
此外,复杂性为O(len)
,因此即使列表长,len
也是决定因素。
如果op
或其他人调用list.size < len
other