我正在努力学习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。请帮我理解。谢谢。
答案 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返回有意义的东西。