To nie jest tak proste, jak to tylko pominięcie słowa kluczowego return
. W programie Scala, jeśli nie ma wartości return
, za ostatnie wyrażenie przyjmuje się wartość zwracaną. Jeśli więc ostatnim wyrażeniem jest to, co chcesz zwrócić, możesz pominąć słowo kluczowe return
. Ale jeśli to, co chcesz zwrócić, nie jest ostatnim zdaniem, to nie będzie to, wtedy Scala nie będzie wiedziała, że chcesz go zwrócić:.
Przykład:
def f() = {
if (something)
"A"
else
"B"
}
Oto ostatni wyraz funkcji f
jest if/else wyrażenie, którego wynikiem jest String. Ponieważ nie zaznaczono żadnego wyraźnego return
, Scala wywnioskuje, że chciałeś zwrócić wynik tego wyrażenia if/else: a String.
Teraz, jeśli dodamy coś po if/else wyrażenie:
def f() = {
if (something)
"A"
else
"B"
if (somethingElse)
1
else
2
}
Teraz ostatnie wyrażenie jest if/else wyrażenie dające do Int. Tak więc typem zwrotu f
będzie Int. Jeśli naprawdę chcemy, aby zwrócił String, to mamy kłopoty, ponieważ Scala ma nie ma pojęcia, że to jest to, co zamierzaliśmy. W związku z tym musimy to naprawić, przechowując ciąg do zmiennej i zwracając go po drugim wyrażeniu if/else lub zmieniając kolejność tak, aby część String stała się ostatnia.
Wreszcie możemy uniknąć słowa kluczowego return
nawet z zagnieżdżonego wyrażenia if-else jak Twoja:
def f() = {
if(somethingFirst) {
if (something) // Last expression of `if` returns a String
"A"
else
"B"
}
else {
if (somethingElse)
1
else
2
"C" // Last expression of `else` returns a String
}
}
Istnieje ** zazwyczaj ** nie ma potrzeby stosowania słowa kluczowego return, o ile złamiesz kod na wystarczająco małe metody. – mauhiz
@mauhiz Dzięki. Czy możesz to wyjaśnić? Jak to zrobisz. – Jatin
wygląda na to, że bierzesz kurs Coursera scala. wszystko co najlepsze :) – weima