使用 Kotlin,为什么此代码仅适用于 3 种可能性中的 2 种?
Using Kotlin, why does this code only work for 2 of the 3 possibilities?
当我在我的 phone 上 运行 时,我点击的按钮只会执行 3 种可能操作中的 2 种,并且它会根据我在代码中交换顺序的方式而变化。例如,通常第一个选项根本不做任何事情,但有时第一个和最后一个选项起作用,这取决于我如何重新排列代码。我不知道是怎么回事。这是我用来执行此操作的代码。
private fun changeScore() {
when ((1..10).random()) {
1 or 2 or 3 or 4 or 5-> win()
6 -> Toast.makeText(this, "neither", Toast.LENGTH_SHORT).show()
7 or 8 or 9 or 10 -> loss()
}
balance.text = getString(R.string.score, coins.toString())
}
private fun loss() {
coins --
Toast.makeText(this, "loss", Toast.LENGTH_SHORT).show()
}
private fun win() {
coins ++
Toast.makeText(this, "win", Toast.LENGTH_SHORT).show()
}
当我点击按钮时,你应该有机会失去 1 个硬币或获得 1 个硬币,并且有十分之一的机会什么都不会发生。此外,作为一个调试助手,所有 3 个选项都值得敬酒。相反,3 个选项中的一个什么都不做,没有硬币,也没有吐司。我试图忽略这个错误并重新排列它,所以不起作用的那个是只敬酒的那个,但我无法让它工作。我该如何解决这个问题,以便所有 3 个都有可能?请记住,我只有不到一周的 Kotlin 经验,所以请考虑到这一点进行解释,因为我对一般编码还比较陌生。
如果你想让一个when
块处理多个条件,你需要用逗号分隔参数,而不是or
val i = 4
when(i) {
4, 5 -> println("a") // will print "a"
else -> println("b")
}
而不是
val i = 4
when(i) {
4 or 5 -> println("a")
else -> println("b") // will print "b"
}
如果您想更好地理解 when 在做什么,您可以像这样 or
扩展它在做什么
val i = 4
val j = 4 or 5
println("j = $j") // will print "j = 5"
when(i) {
j -> println("a")
else -> println("b") // will print "b"
}
4 or 5
语句被评估为单个数字,而不是一系列条件。
您不应该在 when 情况下使用 or
- 它是按位或运算符。
这意味着您的 1 or 2 or 3 or 4 or 5
等于 7
,第三种情况是 15
。这导致您选择的案例“异常”。
https://kotlinlang.org/docs/control-flow.html#when-expression 解释了如何正确地进行你想要的切换:
when(i){
in 1..5 -> win() // use a range
6 -> tie()
7,8,9,10 -> loss() // or separate values with commas
}
当我在我的 phone 上 运行 时,我点击的按钮只会执行 3 种可能操作中的 2 种,并且它会根据我在代码中交换顺序的方式而变化。例如,通常第一个选项根本不做任何事情,但有时第一个和最后一个选项起作用,这取决于我如何重新排列代码。我不知道是怎么回事。这是我用来执行此操作的代码。
private fun changeScore() {
when ((1..10).random()) {
1 or 2 or 3 or 4 or 5-> win()
6 -> Toast.makeText(this, "neither", Toast.LENGTH_SHORT).show()
7 or 8 or 9 or 10 -> loss()
}
balance.text = getString(R.string.score, coins.toString())
}
private fun loss() {
coins --
Toast.makeText(this, "loss", Toast.LENGTH_SHORT).show()
}
private fun win() {
coins ++
Toast.makeText(this, "win", Toast.LENGTH_SHORT).show()
}
当我点击按钮时,你应该有机会失去 1 个硬币或获得 1 个硬币,并且有十分之一的机会什么都不会发生。此外,作为一个调试助手,所有 3 个选项都值得敬酒。相反,3 个选项中的一个什么都不做,没有硬币,也没有吐司。我试图忽略这个错误并重新排列它,所以不起作用的那个是只敬酒的那个,但我无法让它工作。我该如何解决这个问题,以便所有 3 个都有可能?请记住,我只有不到一周的 Kotlin 经验,所以请考虑到这一点进行解释,因为我对一般编码还比较陌生。
如果你想让一个when
块处理多个条件,你需要用逗号分隔参数,而不是or
val i = 4
when(i) {
4, 5 -> println("a") // will print "a"
else -> println("b")
}
而不是
val i = 4
when(i) {
4 or 5 -> println("a")
else -> println("b") // will print "b"
}
如果您想更好地理解 when 在做什么,您可以像这样 or
扩展它在做什么
val i = 4
val j = 4 or 5
println("j = $j") // will print "j = 5"
when(i) {
j -> println("a")
else -> println("b") // will print "b"
}
4 or 5
语句被评估为单个数字,而不是一系列条件。
您不应该在 when 情况下使用 or
- 它是按位或运算符。
这意味着您的 1 or 2 or 3 or 4 or 5
等于 7
,第三种情况是 15
。这导致您选择的案例“异常”。
https://kotlinlang.org/docs/control-flow.html#when-expression 解释了如何正确地进行你想要的切换:
when(i){
in 1..5 -> win() // use a range
6 -> tie()
7,8,9,10 -> loss() // or separate values with commas
}