Почему лямбда-функции Kotlin не выполняются при вызове? - PullRequest
0 голосов
/ 28 февраля 2019

В следующем коде у меня есть 2 функции - первая, завернутая в лямбда-тело, а другая без.

fun first() = { println("first")}
fun second() = println("second")

first()
second()

Только second() отпечатки - почему это так?

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Попробуйте

first()()

или

first().invoke()

first возвращает функцию, она не вызывает ее.

0 голосов
/ 28 февраля 2019

Первая функция - это функция, которая возвращает функцию.На самом деле first() возвращает другую функцию, которая печатает «сначала», но не выполняет ее.

Для этого вам нужно вызвать ее, добавив еще один набор скобок:

first()()
// Or
val resultOfFirst = first()
resultOfFirst()

Это происходит потому, что знак = для функций аналогичен оператору возврата, а когда вы заключаете вещи в {}, вы фактически создаете лямбду.Следовательно, сначала возвращает лямбду, но не выполняет ее

0 голосов
/ 28 февраля 2019

Это очень просто.Проверьте их типы:

fun first(): () -> Unit = { println("first") }
fun second(): Unit = println("second")

Итак, когда вы звоните first, вы получаете выражение лямда.Для вызова этой функции используйте .invoke() (или просто ()):

first().invoke()
// or
first()()

Второе очевидно - оно выполняется при вызове.

0 голосов
/ 28 февраля 2019

Функция first возвращает функцию { println("first")}.

Вызов first() ничего не делает - даже ее возвращаемый аргумент не перехватывается.

Без лямбды эквивалент будетможет быть, легче понять это в такой форме:

fun firstWithoutLambda() = fun() { println("first w/o lambda")}

Чтобы позвонить им:

first().invoke()
firstWithoutLambda().invoke()

, которая напечатает ожидаемые сообщения.

Оторигинальный учебник Kotlin хорошая статья: https://kotlinlang.org/docs/reference/lambdas.html

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