如何在kotlin中正确地控制数据流
有人可以向我解释为什么这个代码块通常会打印这些行,我们使用何时来控制数据流使用多种可能性就像是!在这里是我的代码:
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
逗号分隔的条件是用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
类,而不是检查obj
是否是Int
一个实例。
此外,即使我们将!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
来评估,所以一切都将是“不是一个数字”,因为一切都不是一个长或 不是一个整数等等。