我具有以下功能来模拟Kotlin的三元运算符
fun Boolean.then(action: () -> Unit): Boolean {
if (this)
action.invoke()
return this
}
fun Boolean.otherwise(action: () -> Unit) {
if (!this)
action.invoke()
}
fun <T> Boolean.then(func: () -> T): T? {
if (this)
return func.invoke()
return null
}
fun <T> T?.otherwise(action: () -> T): T {
return this ?: action.invoke()
}
应该这样使用它们:
(check).then { doHello() }.otherwise { doWorld() }
val answer = (check).then { "hello" }.otherwise { "world" }
但是,当我尝试使用上述运算符分配值时,
val visibility: Int = (show).then { View.VISIBLE }.alt { View.GONE }
我收到一条错误消息,要求的答复是Int,但实际上得到的是Unit,这意味着它调用了方法的第一个版本而不是第二个版本
除了重命名方法之外(当我将前两个更改为thenDo和elseDo起作用时),我是否可以通过某种方式编写上述代码,以便编译器知道调用第二个版本?
答案 0 :(得分:2)
我认为您不需要两个重载。如果删除返回Unit
的代码,则两行代码都可以工作:
(check).then { doHello() }.otherwise { doWorld() }
val answer = (check).then { "hello" }.otherwise { "world" }
这是因为第一行中,lambda返回Unit
,例如doHello()
仍可以使用then
和otherwise
的通用版本,因为它们仍被视为具有返回值即Unit
的函数。
尽管我同意上面的一些评论:您真的需要这个吗?为什么不只使用if
,它是一个返回值的表达式(如三元运算符)。有关更多信息,请参见讨论here。