斯卡拉总是回归真实....为什么?

时间:2012-09-28 21:29:25

标签: scala

我正在努力学习Scala并且是新手。我知道这不是最佳的功能代码,欢迎任何人都可以给我的建议,但我想了解为什么我会继续这个功能。

  def balance(chars: List[Char]): Boolean = {
    val newList = chars.filter(x => x.equals('(') || x.equals(')'));
    return countParams(newList, 0)
  }                                               

  def countParams(xs: List[Char], y: Int): Boolean = {
    println(y + " right Here")
    if (y < 0) {
      println(y + " Here")
      return false
    } else {
      println(y + " Greater than 0")
      if (xs.size > 0) {
        println(xs.size + " this is the size")
        xs match {
          case xs if (xs.head.equals('(')) => countParams(xs.tail, y + 1)
          case xs if (xs.head.equals(')')) => countParams(xs.tail, y - 1)
          case xs => 0
        }
      }
    }
    return true;
  }
  balance("()())))".toList)

我知道我正在使用if语句的false分支,但在函数结束时它仍然返回true。请帮我理解。谢谢。

2 个答案:

答案 0 :(得分:3)

您必须在返回的内容中更明确,或者使编译器更明确。这有效:

def countParams(xs: List[Char], y: Int): Boolean = {
    println(y + " right Here")
    if (y < 0) {
      println(y + " Here")
      false
    } else {
      println(y + " Greater than 0")
      if (xs.size > 0) {
        println(xs.size + " this is the size")
        xs match {
          case xs if (xs.head.equals('(')) => countParams(xs.tail, y + 1)
          case xs if (xs.head.equals(')')) => countParams(xs.tail, y - 1)
          case xs => false
        }
      } else {
        true
      }
    }
}

在上面的代码中,if的每个分支都返回一些值,因此编译器假定它是一个要返回的值。没有记录的BTW版本和更多的惯用语:

def countParams(xs: List[Char], y: Int) =
    xs match {
        case Nil => y == 0
        case '(' :: rest => countParams(rest, y + 1)
        case ')' :: rest if(y > 0) => countParams(rest, y - 1)
        case _ => false  //must be closing parens but y < 0
    }

答案 1 :(得分:2)

scala中的if是一个表达式。它返回一个值,在概念上与其他语言中的三元相似。

如果你想在你的else分支中返回一些东西,你应该为嵌套if有一个else,并允许它返回一个值。

换句话说,countParams正在评估所有代码,并且落到了分配给countParams的块中的最后一行({})。也就是true;

简而言之,在countParams结束时丢失true,并给出你的嵌套if if返回有意义的东西。