为什么这样做?
object Foo extends App {
def bar(s: String): String = {
if (s.size == 0) "empty string"
else if (s.size == 1) s + s
else s.head + bar(s.tail)
}
println(bar(""))
println(bar("s"))
println(bar("soom"))
}
[info] Running example.Foo
empty string
ss
soomm
虽然这不是。
object Foo extends App {
def bar(s: String): String = {
if (s.size == 0) "empty string"
if (s.size == 1) s + s
s.head + bar(s.tail)
}
println(bar(""))
println(bar("s"))
println(bar("soom"))
}
java.util.NoSuchElementException: next on empty iterator
难道不应该return
使代码短路而不前进吗?我觉得对于第二个代码段为什么不起作用有一个简单的解释,但是我似乎找不到原因。
首先,您缺少return
陈述。在Scala中,函数最后一行的值作为返回值返回。
现在,您的第一个代码段有效,因为if else语句被视为一个表达式,因此您确实有一个表达式作为要返回的最后一行。
在您的第二个代码段中,前两个if无效,因为没有return语句。他们被评估,然后什么也没有发生。您的空字符串大小写将导致该s.head + bar(s.tail)
行失败,因为.head找不到元素。
您可以使用第一个代码段,也可以将第二个代码段更改为此。
object Foo extends App {
def bar(s: String): String = {
if (s.size == 0) return "empty string"
if (s.size == 1) return s + s
s.head + bar(s.tail)
}
println(bar(""))
println(bar("s"))
println(bar("soom"))
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句