Poznaję nowy i bardzo piękny język Kotlin i wszystko wydaje się być bardzo logiczne i spójne. Znalazłem tylko jedną rzecz, która wydaje się arbitralnym wyjątkiem od reguły, niż solidną regułą. Ale może brakuje mi wystarczającej wiedzy na temat głębszych przyczyn tej reguły.zwraca ostatnie wyrażenie w bloku
Wiem, że w instrukcjach i when
są bloki kodu, a następnie zwracane jest ostatnie wyrażenie. W kolejnym przykładzie 1
lub 2
są zwracane w zależności od warunku - w naszym przypadku zwraca 1
.
val x = if (1 < 2) {println("something"); 1} else {println("something else"); 2}
Z drugiej strony nie dotyczy to żadnego bloku kodu. Następny wiersz przypisuje y
nie do 1
, ale do całego bloku kodu jako lambda.
val y = {println("something"); 1}
Podobnie w treści funkcji ostatnie wyrażenie nie jest zwracane. To nawet nie kompiluje.
fun z() : Int {
println("something")
1
}
Jaka jest dokładnie reguła? Czy rzeczywiście jest tak arbitralny: jeśli w instrukcji if-else
lub when
, która jest używana jako wyrażenie, znajduje się blok kodu, zwracane jest ostatnie wyrażenie w bloku. W przeciwnym razie ostatnie wyrażenie nie zostanie zwrócone do zewnętrznego zakresu. Czy może czegoś brakuje?
Tak, to jest chyba to, co mam na myśli moim komentarzem. '{}' ma trzy (lub jeszcze więcej? Czy brakuje mi niektórych?) różnych ról - może to być blok w instrukcji sterowania przepływem lub może to być lambda lub może być ciałem funkcji. W przypadku wszystkich tych przypadków obowiązują inne zasady. Nie chcę narzekać ani narzekać, będę musiał wziąć to, jak jest. Ale wydaje mi się to nieco niespójną wadą projektowania językowego nienagannego języka. –
@ V.K. tak jest. masz rację. –
Mój styl kodowania na to pytanie jest taki, że postaram się unikać bloków w instrukcjach kontroli przepływu, gdy są one używane jako wyrażenia. Pochodzę z dziedzin C++ i Python i nie ma to jak "zwróć ostatnie wyrażenie w bloku", więc użyję wyrażenia "if" lub "when" jako wyrażenia tylko wtedy, gdy zwracane wyrażenia są trywialne (bez bloku), np. 'a = if (x) y else z'. W przeciwnym razie użyję pełnej składni "if (x) {println (" something "); a = y} else {println ("coś innego"); a = z} 'jak wiemy z innych języków. –