2

我正在尝试学习 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 语句的错误分支,但它在我的函数结束时仍然返回 true。请帮我理解。谢谢。

4

2 回答 2

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返回一些值,因此编译器假定它是要返回的值。顺便说一句,没有日志记录和更惯用的版本:

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
    }
于 2012-09-28T21:36:20.827 回答
2

ifin scala 是一个表达式。它返回一个值,并且在概念上类似于其他语言中的三元。

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

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

简而言之,在 countParams 的末尾丢失 true,并给你的嵌套 if 一个 else 返回有意义的东西。

于 2012-09-28T21:36:00.663 回答