Vin*_*ren 5 return function kotlin
我在Kotlin中有一个应该返回Unit的函数有麻烦,但是由于使用了另一个返回布尔值的函数,所以存在类型不匹配.
这是一个人为的例子:
fun printAndReturnTrue(bar: Int): Boolean {
println(bar)
return true
}
fun foo(bar: Int): Unit = when(bar) {
0 -> println("0")
else -> printAndReturnTrue(bar)
}
Run Code Online (Sandbox Code Playgroud)
在这里,我实际上并不关心printAndReturnTrue返回布尔值的事实.我只想让foo执行副作用操作.但编译器警告类型不匹配:我else应该返回一个Unit值.
有没有一种很好的方法将值转换为Unit?
我看到的最简单的解决方案是:
fun foo(bar: Int): Unit = when(bar) {
0 -> println("0")
else -> {
printAndReturnTrue(bar)
Unit
}
}
Run Code Online (Sandbox Code Playgroud)
要么:
fun foo(bar: Int): Unit = when(bar) {
0 -> println("0")
else -> eraseReturnValue(printAndReturnTrue(bar))
}
fun eraseReturnValue(value: Any) = Unit
Run Code Online (Sandbox Code Playgroud)
或者我使用完整的函数形式:
fun foo(bar: Int): Unit {
when(bar) {
0 -> println("0")
else -> printAndReturnTrue(bar)
}
}
Run Code Online (Sandbox Code Playgroud)
我确信有一些惯用的方法(或者是最后一个例子?),但是现在我没有找到它们.
不幸的是,没有惯用的方法来做到这一点.一个类似的问题,将类型的lambda传递给(T) -> Boolean接受(T) -> Unitlambdas 的函数之前已经出现过,并且在那里需要的自动转换应该在未来某个时候出现.
现在,您可以在when表达式的末尾使用扩展函数将其强制转换为Unit值:
fun Any?.toUnit() = Unit
fun foo(bar: Int): Unit = when(bar) {
0 -> println("0")
else -> printAndReturnTrue(bar)
}.toUnit()
Run Code Online (Sandbox Code Playgroud)
或者,扩展属性,如果您碰巧更喜欢这样:
val Any?.unit get() = Unit
fun foo(bar: Int): Unit = when(bar) {
0 -> println("0")
else -> printAndReturnTrue(bar)
}.unit
Run Code Online (Sandbox Code Playgroud)
当然Unit,如果您使用其中任何一个,您可以省略函数的显式返回类型.