«Неоднозначность разрешения перегрузки» с и без «приостановки» лямбда-функции в функциях - PullRequest
4 голосов
/ 16 февраля 2020

Посмотрите на этот пример:

fun f(block: suspend () -> Unit) {
    println("with suspend")
}

fun f(block: () -> Unit) {
    println("without suspend")
}

fun main() {
    f(suspend {
    })

    // This call cause compilation error:
    // Error:(16, 5) Kotlin: Overload resolution ambiguity:
    // public fun f(block: () -> Unit): Unit defined in root package in file Main.kt
    // public fun f(block: suspend () -> Unit): Unit defined in root package in file Main.kt
    //
    // f({
    // })

    // This call cause compilation error:
    //
    // Error:(25, 5) Kotlin: Overload resolution ambiguity:
    // public fun f(block: () -> Unit): Unit defined in root package in file Main.kt
    // public fun f(block: suspend () -> Unit): Unit defined in root package in file Main.kt
    //
    // f {
    // }
}

Здесь объявлены две функции (одна с ключевым словом suspend в лямбде и одна без).

Вопросы:

1) Как вызвать первую или вторую функцию? Как видите, я могу вызывать функцию с помощью suspend, но не могу вызывать функцию без ключевого слова suspend.

2) Можно переписать f(suspend {}) с помощью конечная лямбда ( т.е. использовать что-то вроде f suspend {})?

1 Ответ

4 голосов
/ 16 февраля 2020

1) Вы можете вызвать вторую функцию с некоторыми обходными путями. Например,

val foo = {}
f(foo)

или

f({}.also{})

или даже короче:

f({}!!)

вызовет функцию с параметром non-suspend. В этих случаях вы объявляете лямбду вне контекста как параметр функции, поэтому по умолчанию она не приостанавливается.

2) Конечный лямбда-синтаксис не поддерживает явный модификатор suspend, поэтому необходимо использовать скобки объявить, что ваша лямбда приостановлена.

...