Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义Kotlin时的表达式_Kotlin - Fatal编程技术网

自定义Kotlin时的表达式

自定义Kotlin时的表达式,kotlin,Kotlin,我对Kotlin很陌生,我想要的是: when_assert_no_else { CONDITION0 -> { doSomething0() } CONDITION1 -> { doSomething1() } } 这就像 when { CONDITION0 -> { doSomething0() } CONDITION1 -> { doSometh

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

when_assert_no_else {
    CONDITION0 -> {
        doSomething0()
    }
    CONDITION1 -> {
        doSomething1()
    }
}
这就像

when {
    CONDITION0 -> {
        doSomething0()
    }
    CONDITION1 -> {
        doSomething1()
    }
    else -> {
        throw RuntimeException()
    }
}
后一个代码片段在我的项目中出现了很多时间,我想通过抛出异常断言控制流没有到达
else

或者,是否可以通过提供
when\u assert\u no\u else
的实现来定制
when
关键字


有什么想法吗?谢谢。

由于kotlin没有
->
操作符,您无法编写上述代码,但您可以做出一些妥协,例如:使用
Pairbolean,()->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()
}
fun test():Int=when\u assert\u no\u else(
{true}到{1},
{false}到{2}
)
当你断言你没有其他(vararg情况:成对布尔,()->T>)时的乐趣:T{
//v---短路终端操作
返回cases.find{it.first()}
.let{it?:抛出RuntimeException()}
.second()
}

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

您还可以做的是“抽象”else分支。我的意思是创建一个(静态)类,并在断言时添加一个方法。在_-when\u-assert\u-else\u方法中,添加要在then-when的else分支中执行的代码。与当前策略相比的优势在于,当您想要更改else分支时,您必须检查所有代码并将其更改x次。对于函数调用,您只需修改一次