如何在kotlin中正确使用时控制数据流

时间:2017-10-06 10:36:10

标签: kotlin

有人可以向我解释为什么这些代码会阻止打印这些行 通常,我们使用来控制数据流,使用多种可能性,例如 is!in in!in 这里是我的代码:

fun isNumber(obj: Any) {

    when (obj) {
        !is Long, Int, Float, Double -> {
            println("No it's not a number")
        }
        else -> {
            println("Yes it's a number")
        }
    }
}

fun main(args: Array<String>) {

    isNumber(19.10)
    isNumber(19L)
    isNumber(19)
    isNumber(19.10F)

}

结果:

No it's not a number
Yes it's a number
No it's not a number
No it's not a number

1 个答案:

答案 0 :(得分:5)

以逗号分隔的条件使用OR进行评估,每个条件都由它们自己评估,因此我们应该像这样转过来:

    when (obj) {
        is Long, is Int, is Float, is Double -> {
            println("Yes it's a number")
        }
        else -> {
            println("No it's not a number")
        }
    }

您的构造不起作用的原因是,当您在is中遗漏!is Long, Int, Float, Double ->时,我们已经(简化):

   when (obj) {
            Int -> {
            }
            else -> {
            }
        }

表示您检查obj是否等于班级Int,而不是检查objInt的实例。

此外,即使我们将!is添加到每个数字类型,例如:

   when (obj) {
        !is Long, !is Int, !is Float, !is Double -> {
            println("No it's not a number")
        }
        else -> {
            println("Yes it's a number")
        }
    }

它仍然无效,因为如上所述,条件将使用OR进行评估,因此所有内容都不是“数字”,因为所有内容都是 <等等