我已经在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")
}
答案 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
扩展函数使您可以在表达式中使用值(因为它本身会返回值),但也可以“先”对其进行一些操作。