滥用比赛?

时间:2012-09-23 21:05:46

标签: scala coding-style

您是否会认为以下代码块与滥用行为相匹配?如果是这样,如果没有大的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
  }
}

2 个答案:

答案 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 ) ...


另请注意,虽然您最终“知道”硬币不为空,因此可以“安全地”调用headtail,但这是意外运行时错误的典型来源。 coins match { case Nil => ...; case head :: tail => ...}的优点是你不能犯这样的错误。