2016-06-10 60 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。 –

相關問題