应该使用带有主题的 kotlin

kotlin when with subject should be used

我对科特林的 when 声明很感兴趣。它看起来几乎和 lisp cond 一样强大,但又不完全一样。在 kotlin 网站 here 上的一个示例中,您可以看到没有主题。你只是列出布尔表达式,第一个成功的被计算,就像 lisp 的 cond.

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

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

对于这些情况,最好使用 'with' 主题(您可以在 when 中传递的参数)。所以 warning-free 代码将是

   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")
}

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