我对Kotlin来说真的很新,而我想要的是:
when_assert_no_else {
CONDITION0 -> {
doSomething0()
}
CONDITION1 -> {
doSomething1()
}
}
就像
一样when {
CONDITION0 -> {
doSomething0()
}
CONDITION1 -> {
doSomething1()
}
else -> {
throw RuntimeException()
}
}
后面的代码片段在我的项目中显示了很多时间,我想通过抛出异常来断言控制流没有到达else
块。
或者,是否可以通过实施when
来自定义when_assert_no_else
关键字?
请问好吗?谢谢。
答案 0 :(得分:1)
您无法编写上面的代码,因为kotlin没有->
运算符,但您可以做出一些妥协,例如:使用Pair<()->Boolean,()->T>
代替。
fun test(): Int = when_assert_no_else(
{ true } to { 1 },
{ false } to { 2 }
)
fun <T> when_assert_no_else(vararg cases: Pair<() -> Boolean, () -> T>): T {
// v--- short-circuiting terminal operation
return cases.find{ it.first() }
.let { it ?: throw RuntimeException() }
.second()
}
答案 1 :(得分:0)
我还想到了holi-java的解决方案,但它可能不足以满足所有场景。例如,考虑分支中的副作用。
你还可以做的是“抽象”其他分支。我的意思是你创建一个(静态)类并添加一个方法 when_assert_else 。在_when_assert_else_方法中,添加要在当时的else分支中执行的代码。与当前策略相比,优势在于,当您想要更改 else 分支时,您必须完成所有代码并将其更改x次。通过函数调用,您只需修改一次。