Результат продолжает говорить: «Несоответствие типов: предполагаемый тип - Unit, но ожидалось String». - PullRequest
1 голос
/ 05 августа 2020

Я запустил следующий код на play.kotlinlang.org , но результат продолжает говорить: Type mismatch: inferred type is Unit but String is expected (Я внес некоторые изменения из исходного кода примера)

У меня нет идея, почему его выводящий тип - Unit. Я думал, что объявил возвращаемый тип как String. Тип модуля println() или я просто неправильно написал всю функцию ring?

fun main(){
    val squid:(String)->String={str->println("I'm $str")}
    //ring(::rabbit)
    ring(squid)
}

fun rabbit(str:String):String{
    println("I'm $str")
    return str
}

fun ring(carrot:(String)->String){
    carrot("a appetiting squid")
}

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Как указано в Anime sh, вы не возвращаете String n squid

val squid:(String)->String определяет лямбду, которая принимает String и возвращает String

{str->println("I'm $str")}

Лямбда вернет значение в последней строке лямбда, но в этом случае это последнее значение будет println("I'm a $str")

println return Unit, или, скорее, оно не вернет что угодно (что представляет собой Unit). Поэтому, если вы все еще хотите распечатать строку И вернуть ее, перепишите ее так:

{ str -> 
   println("I'm $str")
   str // This string is the value that will now be returned.
}
0 голосов
/ 06 августа 2020

лямбда возвращает Unit, потому что println возвращает Unit.

Вы можете написать эту строку следующим образом:

 val squid:(String)->String={str-> str.also { println("I'm $it") }}

Стандартная функция расширения also позволяет вам используйте значение в выражении (потому что оно возвращает само значение), но «также» сначала сделайте что-нибудь с ним.

...