我对以下两个Kotlin代码片段感到困惑:
:
val r: Result<Unit> = Result.success(Unit).map { Result.success(Unit) }
B:
val r: Result<Int> = Result.success(Unit).map { Result.success(1) }
代码段A可以编译,而代码段B不能编译。
谁能解释一下为什么代码段A可以和Kotlin类型系统一起工作?
您不应该从map
lambda返回结果。你应该返回一个将被包装在Result中的值。这就是代码B失败的原因。只用map { 1 }
就能成功。
代码A成功是因为当Kotlin期望lambda返回Unit时,它隐式地返回Unit,而不管lambda中的最后一行代码是什么。如果它不这样做,任何没有返回值的lambda都必须以一行表示Unit的行结束。同样,任何没有显式返回值的函数都有一个隐式返回类型Unit,但是编译器不要求你在函数的末尾显式地写return Unit
。