a-6ren">
gpt4 book ai didi

Kotlin when(Pair<>),还有其他方法吗?

转载 作者:行者123 更新时间:2023-12-01 12:11:46 25 4
gpt4 key购买 nike

我有一个 when 结构想要匹配两件事:

when (activeRequest.verb to activeRequest.resourceType) {
GET to "all" -> allGet()
PUT to "foo" -> fooPut()
GET to "foo" -> fooGet()
POST to "bar" -> barPost()
GET to "bar" -> barGet()
COPY to "bar" -> barCopy()
DELETE to "bar" -> barDelete()
else -> logMismatch()
}

使用 to 对构造函数是唯一的方法吗? Pair 的用法似乎很奇怪(尽管它有效)。我很难找到它,因为代码片段像
for ((key, value) in hashMap) {
println("$key $value)
}

让我觉得我应该能够在 when 代码中做类似的事情,例如
when (activeRequest.verb, activeRequest.resourceType) {
(GET, "all") -> allGet()
(PUT, "foo") -> fooPut()
...
else -> logMismatch()
}

虽然这对有效……如果我想做 3 个项目怎么办?

最佳答案

for 循环示例中的语法是 destructuring declaration ,它基本上是一种语法糖,用于在一行中声明对对象的多个成员变量的引用。它不会反过来,因为 Kotlin 没有用于任意元组的机制。

我真的想不出一个漂亮的方法来用两个以上的变量来做到这一点。我想到的选项是使用 enum ,它基本上作为这样的元组工作:

enum class Response(val verb: String, val type: String) {

GET_FOO("GET", "foo"),
...
INVALID("?", "?");

companion object {
fun from(verb: String, type: String): Response {
for(response in values()) {
if(response.verb == verb && response.type == type)
return response
}

return INVALID
}
}
}

when(Response.from(activeRequest.verb, activeRequest.resourceType)) {
GET_FOO -> getFoo()
...
}

或者使用数组。不幸的是,Kotlin 数组相等不是由内容决定的,所以你最终会得到很多样板,而且 when 语法不再看起来很好。 (我加了一个扩展函数让这个更好一点,但我还是不喜欢它):
fun Array<*>.whenCheat(vararg others: Any?): Boolean {
return this contentEquals others
}

val array = arrayOf("GET", "foo")
when {
array.whenCheat("GET", "foo") -> getFoo()
...
}

我的怀疑是,对函数的响应图会更好地服务于这种事情。希望其他人提出更聪明的解决方案。

关于Kotlin when(Pair<>),还有其他方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51315468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com