在表达时自定义Kotlin

我对Kotlin真的很陌生,我想要的是这样的:

when_assert_no_else { CONDITION0 -> { doSomething0() } CONDITION1 -> { doSomething1() } } 

它的工作原理就像

 when { CONDITION0 -> { doSomething0() } CONDITION1 -> { doSomething1() } else -> { throw RuntimeException() } } 

后面的代码片段在我的项目中显示了很多时间,我想通过抛出一个异常来断言控制流没有到达else块。

或者,是否有可能通过给予when_assert_no_else的实现来定制关键字?

有什么想法吗? 谢谢。

你不能写上面的代码,因为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() } 

我也想到了holi-java的解决方案,但它可能不足以满足所有情况。 例如考虑分支机构的副作用。

你可以做的也是“抽象”else分支。 我的意思是你创建一个(静态)类并添加一个方法when_assert_else 。 在_when_assert_else_方法中,你添加了你在那个时候的else分支中执行的代码。 当前策略的优点是,当你想改变else分支时,你必须遍历所有的代码,并将它改变x次。 通过函数调用,您只需修改一次即可。