表达时自定义Kotlin

时间:2017-07-02 07:58:50

标签: kotlin

我对Kotlin来说真的很新,而我想要的是:

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

就像

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

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

或者,是否可以通过实施when来自定义when_assert_no_else关键字?

请问好吗?谢谢。

2 个答案:

答案 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次。通过函数调用,您只需修改一次。