在Kotlin中,模式匹配很好,并且在90%的用例中,它不执行下一个模式匹配也很不错。
在Android中,当数据库更新时,如果不让代码看起来像这样,我们将使用Java switch属性进行下一种情况:

switch (oldVersion) {
    case 1: upgradeFromV1();
    case 2: upgradeFromV2();
    case 3: upgradeFromV3();
}
因此,如果某人拥有一个数据库版本为1的应用程序,而错过了DB v2版本的应用程序,那么他将获得所有所需的升级代码。
转换为Kotlin后,我们会像这样困惑:
when (oldVersion) {
    1 -> {
        upgradeFromV1()
        upgradeFromV2()
        upgradeFromV3()
    }
    2 -> {
        upgradeFromV2()
        upgradeFromV3()
    }
    3 -> {
        upgradeFromV3()
    }
}
这里只有3个版本,假设DB达到19版。
反正以相同的方式做出 Action 然后切换?我试图继续没有运气。

最佳答案

简单但罗word的解决方案是:

if (oldVersion <= 1) upgradeFromV1()
if (oldVersion <= 2) upgradeFromV2()
if (oldVersion <= 3) upgradeFromV3()

function references的另一种可能的解决方案:
fun upgradeFromV0() {}
fun upgradeFromV1() {}
fun upgradeFromV2() {}
fun upgradeFromV3() {}

val upgrades = arrayOf(::upgradeFromV0, ::upgradeFromV1, ::upgradeFromV2, ::upgradeFromV3)

fun upgradeFrom(oldVersion: Int) {
    for (i in oldVersion..upgrades.lastIndex) {
        upgrades[i]()
    }
}

10-08 17:56