结果一直说:"Type mismatch: inferred type is Unit but String was expected"

The result keeps saying: "Type mismatch: inferred type is Unit but String was expected"

我在 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")
}

正如 Animesh 指出的那样,您没有 returning String n squid

val squid:(String)->String 定义了一个接受字符串的 lambda,return 是一个字符串

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

lambda 将 return lambda 最后一行的值,但在这种情况下,最后一个值是 println("I'm a $str")

println return Unit,或者更确切地说,它没有 return 任何东西(这就是 Unit 所代表的)。因此,如果您仍想打印 String AND return 它,请像这样重写它:

{ str -> 
   println("I'm $str")
   str // This string is the value that will now be returned.
}

lambda returns Unit 因为 println returns Unit.

你可以这样写那一行:

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

标准 also 扩展函数允许您在表达式中使用值(因为它 returns 值本身),但“也”先用它做一些事情。