我有一个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循环示例中的语法是一种解构声明,它基本上是一种语法糖,用于在一行中声明对一个对象的多个成员变量的引用。它不会反过来,因为Kotlin没有用于任意元组的机制。
我真的想不出一种美观的方法来使用两个以上的变量来完成此任务。我想到的选择是使用基本上像这样的元组工作的枚举:
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()
...
}
我怀疑,通过对功能的响应图可以更好地解决这类问题。希望其他人会提供更聪明的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句