结果不断说:“类型不匹配:推断的类型为Unit,但应为String”

时间:2020-08-05 15:27:32

标签: kotlin grammar

我已经在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 个答案:

答案 0 :(得分:1)

正如Animesh所指出的,您不会返回String n squid

val squid:(String)->String定义了一个lambda,该lambda接受一个字符串并返回一个字符串

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

Lambda将返回Lambda的最后一行的值,但在这种情况下,最后一个值为println("I'm a $str")

println返回Unit,或更确切地说,它不返回任何内容(Unit代表的内容)。因此,如果您仍然想打印字符串并返回它,请像这样重写它:

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

答案 1 :(得分:0)

lambda返回Unit,因为println返回Unit

您可以按如下方式编写该行:

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

标准的also扩展函数使您可以在表达式中使用值(因为它本身会返回值),但也可以“先”对其进行一些操作。