Почему передача переменной в лямбду в Kotlin работает? - PullRequest
0 голосов
/ 28 августа 2018

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

fun getNum(op: () -> Int) = op()

И функция, которая возвращает число:

fun getTen() = 10

В основной функции я могу вызвать функцию getNum() следующим образом

fun main(args: Array<String>){
    val x = 50
    val a = getNum(::getTen)    // a == 10
    val b = getNum{x}           // this works and b == 50
}

Почему работает передача varibale вместо лямбды? Любая идея? Спасибо.

1 Ответ

0 голосов
/ 28 августа 2018

В Kotlin, последнее или единственное выражение в лямбде является возвращаемым значением .

В выражении getNum { x } { x } является лямбда-выражением с одним выражением x, которое, таким образом, считается возвращаемым значением, поэтому при вызове лямбда-выражения оценивается только x, захваченное в замыкание и возвращает его значение обратно в getNum.

Вызов getNum(::getTen), в свою очередь, использует вызываемую ссылку (она различима знаком ::), которая может быть передана как значение функционального типа () -> Int точно так же, как если бы это было getNum { getTen() }.

См. Лямбда-выражения и анонимные функции в справочнике по языку.

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