2017-01-12 14 views
11

Wygląda na to, że ostatnia linijka lambda zawsze zwraca tę wartość, nawet jeśli pominięto instrukcję return. Czy to jest poprawne? Czy jest to udokumentowane w dowolnym miejscu?Niejawny zwrot z lambda w Kotlinie

fun main(args: Array<String>) { 
    val nums = arrayOf(1, 2, 3) 
    val numsPlusOne = nums.map { it -> 
     val r = it + 1 
     r 
    } 
    // numsPlusOne = [2, 3, 4] 
} 
+2

Po prostu pomocna wskazówka, możesz ją skrócić do 'val numsPlusOne = nums.map {it + 1}' (ponieważ 'it' jest implikowane, jeśli nie jest podane, i jeśli' it + 1' jest ostatnią linią, to wynik zostanie zwrócony jako wyjaśniony @hotkey) –

Odpowiedz

24

Tak, to prawda, jeśli ostatnia instrukcja lambda jest wyrażeniem, uznaje się ją za wartość zwracaną.

Oto what the reference says (dzięki @KirillRakhman):

Możemy wyraźnie zwrócić wartość z lambda przy użyciu składni qualified return. W przeciwnym razie wartość ostatniego wyrażenia jest nieodwracalnie zwracana. Dlatego dwa następujące fragmenty są równoważne:

ints.filter { 
    val shouldFilter = it > 0 
    shouldFilter 
} 

ints.filter { 
    val shouldFilter = it > 0 
    [email protected] shouldFilter 
} 

Ostatnio semantykę stwierdzenie jest również prawdziwe dla if (that's why there's no ternary operator), when i try-catch bloków, a te stwierdzenia są wyrażenia siebie:

val foo = if (bar) { 
    doSomething() 
    baz 
} else { 
    doSomethingElse() 
    qux 
} 

Patrz również: examples for when and try-catch.

Tak, lambdy są zgodne z konstrukcjami językowymi w tym zakresie.


Jeśli chcesz dokonać wyraźnego return oświadczenie w lambda, użyj [email protected] syntax (także another answer with examples). Nie oznaczony etykietą return, przeciwnie, działa z najbliższym fun (ignorując lambda), a zatem może występować tylko w lambdach, które są inlined.

Pojawił się , aby dodać specjalną składnię dla wartości emitującej wartość z bloku kodu, ale została ona odrzucona.