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

特拉维斯·格里格斯

我有一个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()
}

使用topair构造函数是执行此操作的唯一方法吗?配对似乎很奇怪(尽管它可以工作)。我很难找到它,因为代码片段像

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

除了从密封类继承还有其他方法吗?

除了使用nodetool status之外,还有其他方法可以获取cassandra hostid吗?

还有其他方法可以让Laravel重新加载环境变量吗?

还有其他方法可以在Extjs中声明全局变量吗?

还有其他方法可以定位绝对元素吗?

还有其他方法可以解决R中的这个数学问题吗?

还有其他方法可以实现此代码,以便也使用zip函数吗?

除了DAvg之外,还有其他方法可以找到平均值吗?

我的SQL查询时间太长,还有其他方法吗?

除了将滚动条设置为隐藏以外,还有其他方法吗

斯威夫特:CustomStringConvertible数组数组,还有其他方法吗?

还有其他方法可以在pygame中加载图片吗?

在SwiftUI中无需使用GeometryReader,还有其他方法可以访问safeAreaInsets吗?

还有其他方法可以滤除excel中的空白吗?

还有其他方法可以在php中创建pdf吗?

除了alsactl存储之外,还有什么其他方法可以保存alsamixer设置吗?

PHP还有很多其他方法吗?

还有其他方法可以在javascript中获取对象属性吗?

这个数组在C中可能吗?还有其他方法吗?

python中的Goto语句-还有其他方法吗?

除了使用Xpath之外,还有其他方法吗?

还有其他方法可以为Visual Studio 2015构建opencv吗?

除了 PHPUnit,还有其他方法可以测试 Symfony 应用程序吗?

Vue 多个 v-for 循环......还有其他方法吗

jQuery .each() 不起作用,还有其他方法吗?

还有其他方法可以正确计算 Am 和 Pm 的时间吗?

还有其他方法可以将数组的每个元素传递给函数吗?

除了身份验证之外,还有其他方法可以区分用户吗?

带有 react 和 useRef 钩子的动画?还有其他方法吗?