2016-06-10 113 views
0

这为什么有效?为什么这个值没有被返回,因为它应该在这里?

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不应该短路的代码,而不是前进吗?我觉得有一个简单的解释,为什么第二个代码片段不起作用,但我似乎无法找出原因。

+4

它应该...但没有'return'在你的代码。 – Dima

回答

2

首先,您错过了return声明。在Scala中,函数最后一行的值作为返回值返回。

现在你的第一个代码段出现了,因为如果else语句被视为一个表达式,因此你有一个表达式作为最后一行返回。

在你的第二个代码片断中,前两个ifs没有效果,因为没有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")) 
} 
+0

有道理。谢谢! – aa8y

+1

“在Scala中,函数的最后一行的值作为返回值返回。”这不是真的。 – pedrofurla

+0

请注意,你应该像第一个例子那样构造你的代码,在scala中不鼓励使用return。 –

相关问题