kotlin:忽略let函数的返回类型?

pio*_*rek 0 syntax kotlin

我可以使用2种不同的返回类型创建相同的函数,无论我选择哪个版本,都不会出现编译错误.它是一个bug还是一些语言功能?

fun unitOrInt(): Int  { return 1.let { 1 }}
fun unitOrInt(): Unit { return 1.let { 1 }}
fun unitOrInt()       { return 1.let { 1 }}
Run Code Online (Sandbox Code Playgroud)

的类型1.let{1}IntUnit.为什么Unit允许版本?

yol*_*ole 5

let函数是通用的,其签名inline fun <T, R> T.let(block: (T) -> R): R.调用此函数时,编译器会从封闭上下文中推断出类型参数.

在函数的第一个声明中,编译器知道调用的预期类型Int,因此它将R类型参数推断为Int,并且找到匹配类型的值作为lambda的最后一个表达式.在第二个声明中,期望的类型是Unit,因此编译器推断R as Unit并忽略lambda的最后一个表达式.在第三个声明中,没有返回类型声明,因此编译器Unit会像第二个声明一样替换和分析它.

为了更好地了解发生了什么,您可以let明确声明类型参数:

fun unitOrInt1(): Int  { return 1.let<Int, Int> { 1 }}
fun unitOrInt2(): Unit { return 1.let<Int, Unit> { 1 }}
Run Code Online (Sandbox Code Playgroud)