我的系统里有input,目前是state,还有previous_states.我的第一个 idea 是使用when语句,但Kotlin不支持在其中使用多个变量:

when (input, state, previous_states) {  
  (KeyPower, PowerOff, matched) -> ...
  (KeyPower, PowerOn,  matched) -> ...
  (KeyMenu,  PowerOff, listOf(MainView, _)) -> ...
}

只是一个语法错误.有没有针对这种/完全不同的方法的解决办法?

推荐答案

在这种情况下,您可以使用when,但您必须将三个独立的var/val包装在Triple中.

下面是一个使用String的例子,因为我不知道你的var/val的类型:

fun main() {
    val input = "KeyPower"
    val state = "PowerOn"
    val previous_states = "matched"
    
    when (Triple(input, state, previous_states)) {
          Triple("KeyPower", "PowerOff", "matched") -> println("Power, Off, matched")
          Triple("KeyPower", "PowerOn",  "matched") -> println("Power, On, matched")
          Triple("KeyMenu",  "PowerOff", "matched") -> println("Menu, Off, matched")
          else -> println("no match")
    }
}

输出:

Power, On, matched

when语句需要单个对象,看起来像是…

Kotlin相关问答推荐

用浮点数或十进制数给出错误答案的阶乘计算

如何为集成测试配置Gradle JVM测试套件?

如何进行基于lambda/谓词的两个列表的交集?

房间数据库操作中的协程取消

从 Kotlin 的父类获取函数注解

找不到有效的 Docker 环境

Rabin-Karp字符串匹配的实现(Rolling hash)

Flow.state In() 未从其来源接收新值

Kotlin:不允许在辅助构造函数参数上使用val

Kotlin 方法重载

Kotlin 有 array.indexOf 但我无法弄清楚如何做 array.indexOfBy { lambda }

变量后的Android问号

Android Room - error: Cannot figure out how to save this field into database

如何在 Jetpack Compose 的 LazyColumn/LazyRow 中禁用和启用滚动?

类型不匹配:推断类型为 LoginActivity 但应为 LifecycleOwner

Kotlin中的Memoization功能

在 suspendCoroutine 块中调用挂起函数的适当方法是什么?

我应该使用Kotlin数据类作为JPA实体吗?

Android Kotlin .visibility

如何在kotlin用mockito模仿lambda