Kotlin什么时候应该使用主题

问题描述

我对kotlin的when声明很感兴趣。它似乎几乎像Lisp cond一样强大,但不完全一样。在kotlin网站here上的一个示例中,您可以看到没有主题。您只需列出布尔表达式,然后对第一个成功的表达式进行求值,就像lisp的cond一样。

when {
    handler == null -> print("null")
    else -> print("handler is valid")
}

但这会生成一个编译器警告,提示何时应使用'with'主题。如何在不生成编译器警告的情况下使用此构造?

解决方法

在这些情况下,最好使用'with'主题(您可以在何时传递的参数)。因此,没有警告的代码将是

   when (handler) {
        null -> print("null")
        else -> print("handler is valid")
    }

通常,如果您有两种情况,最好使用if。但是请考虑更多情况。如果必须将处理程序用于其他条件,则将处理程序作为主题传递将使您的代码更整洁。 (不确定是否应该对此产生任何性能影响)

,

我想我明白了。

编译器很聪明,非常聪明。它认识到我的when仅使用一个变量 handler 。警告告诉我,该示例​​中应将变量用作when的主题:

when (handler) {
    it == null -> print("null")
    else -> print("handler is valid")
}

但是,如果我使用多个变量,警告就会消失。编译器似乎认识到主题没有意义。这是一个示例:

when {
    firstHandler == null -> print("first handler is null")
    secondHandler == null -> print("second handler is null")
    else -> print("handlers are both valid")
}

没有警告,因为没有单个主题。