使用 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
}