重複の可能性:
Scala でのリターン
Scala を使い始めたばかりで、よくわからない動作に遭遇しました。stackoverflow コミュニティが何らかの光を当ててくれることを願っています。
このテストの使用:
example(1,List(1))
このコードは期待どおりに機能します - 2 回目の反復で 0 が返されます。
def example(value: Int, list: List[Int]): Int = {
if (list.isEmpty)
return 0
else
return 1
example(value - list.head, list.tail) + example(value, list.tail);
}
ただし、このコードはそうではありません。2 回目の反復で NoSuchElementException("head of empty list") がスローされます。
def example(value: Int, list: List[Int]): Int = {
if (list.isEmpty)
0
else
1
example(value - list.head, list.tail) + example(value, list.tail);
}
違いは、2 番目の例では、関数の最後に別の式があるため、Scala は "0" と "1" が戻り値ではなく、評価される式であると想定していることです。明示的な「return」キーワードにより、最初の例が期待どおりに返されることは理にかなっています。
ただし、2 番目の例の if ステートメントの構文を考えると、"0" は評価される式ではなく、戻り値であることがコンパイラによって認識されると思います。そうでないのはなぜですか?