如何使用Kotlin将函数输出转换为Unit

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)

我确信有一些惯用的方法(或者是最后一个例子?),但是现在我没有找到它们.

zsm*_*b13 8

不幸的是,没有惯用的方法来做到这一点.一个类似的问题,将类型的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,如果您使用其中任何一个,您可以省略函数的显式返回类型.