您是否会认为以下代码块与滥用行为相匹配?如果是这样,如果没有大的if-else-if块,更优雅的方法是什么呢?
def sum(base: Int, xs: List[Int]): Int = {
base match {
case 0 => 1
case _ if (base < 0) => 0
case _ if (xs.isEmpty) => 0
case _ => xs.sum
}
}
答案 0 :(得分:19)
是的,这是滥用比赛。你基本上只是写了一个很大的if-else-if块,但是形式更尴尬。 if语句有什么问题?
我认为写这篇文章要简洁得多:
def countChange(money: Int, coins: List[Int]): Int = {
if(money == 0) 1
else if (money < 0) 0
else if (coins.isEmpty) 0
else countChange(money, coins.tail) + countChange(money - coins.head, coins)
}
如果你想坚持使用match
,你可以将更多的检查移动到匹配本身,这样它实际上可以做一些事情:
def countChange(money: Int, coins: List[Int]): Int = {
(money, coins) match {
case (0, _) => 1
case _ if (money < 0) => 0
case (_, Nil) => 0
case (_, coinsHead :: coinsTail) => countChange(money, coinsTail) + countChange(money - coinsHead, coins)
}
}
答案 1 :(得分:2)
没有。滥用为什么?这是相当可读的IMO ......
我看到的问题是money match ...
相当随意(你只使用第一种情况下的直接模式);一个完整的“滥用”将开始像
() match {
case _ if (money == 0) => 1
...
所以也许坚持if-else;你可以结合第二和第三个条件(if( money < 0 || coins.isEmpty ) ...
)
另请注意,虽然您最终“知道”硬币不为空,因此可以“安全地”调用head
和tail
,但这是意外运行时错误的典型来源。 coins match { case Nil => ...; case head :: tail => ...}
的优点是你不能犯这样的错误。