2017-01-12 5 views
11

Кажется, что последняя строка лямбда всегда возвращает это значение, даже если вы опускаете оператор return. Это верно? Документировано ли это где угодно?Неявный возврат из лямбда в Котлин

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

Полезный совет: вы можете сократить это значение до значения val numsPlusOne = nums.map {it + 1} '(потому что' it' подразумевается, если не указано, и если 'it + 1' является последней строкой, результат будет возвращен как пояснил @hotkey) –

ответ

24

Да, это правильно, если последний оператор лямбда является выражением, считается его возвращаемым значением.

Вот what the reference says (спасибо @KirillRakhman):

Мы можем явно возвращать значение из лямбда с использованием синтаксиса qualified return. В противном случае значение последнего выражения будет принудительно возвращено. Таким образом, две следующие фрагменты кода эквивалентны:

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

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

Последнее утверждение семантику также верно для if (that's why there's no ternary operator), when и try-catch блоков, и эти заявления являются выражением себя:

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

См. Также: examples for when and try-catch.

Итак, лямбда согласуется с языковыми конструкциями в этом отношении.


Если вы хотите сделать явное return заявление в лямбда, используйте [email protected] syntax (также, another answer with examples). Немаркированный return, напротив, работает с ближайшим fun (игнорируя лямбда) и, следовательно, может произойти только в тех лямбдах, которые являются inlined.

Чтобы добавить специальный синтаксис для , введите значение из кодового блока, но оно было отклонено.

Смежные вопросы