1
votes

Échapper à When-Statement (comme continuer ou interrompre) dans Kotlin

J'ai un morceau de code comme suit:

when {
        dateFrom == null && dateTo == null -> Unit
        dateFrom != null -> params["lastUpdated"] = "$dateFrom,"
        dateTo != null -> params["lastUpdated"] = ",$dateTo"
        else -> params["lastUpdated"] = "$dateFrom,$dateTo"
    }

Puis-je échapper au quand d'une manière comme continue dans une boucle ?

J'utilise maintenant dateFrom == null && dateTo == null -> Unit mais ce n'est pas très élégant. ( dateFrom == null && dateTo == null -> True est également possible, mais également pas très élégant)


0 commentaires

3 Réponses :


4
votes

Il n'y a pas de moyen direct de faire cela. Au lieu de simplement renvoyer Unit , ce qui semble correct dans ce cas, vous pouvez encapsuler l'instruction when dans un appel de fonction en ligne de portée, comme run {...} , et utilisez un return @ label :

run { 
    when {
        dateFrom == null && dateTo == null -> return@run
        /* ... */
    }
}

Cette construction peut être plus utile si les branches when sont plus complexes qu'une seule instruction.


1 commentaires

Je pense que quand devrait également fonctionner avec des étiquettes. C'est la meilleure solution pour résoudre ce problème pour le moment.



1
votes

Votre partie else ne réussira jamais, car l'une des 3 premières conditions sera vraie .
Donc votre code équivaut à ceci:

when {
    dateFrom != null && dateTo != null -> params["lastUpdated"] = "$dateFrom,$dateTo"
    dateFrom != null -> params["lastUpdated"] = "$dateFrom,"
    dateTo != null -> params["lastUpdated"] = ",$dateTo"
}

et enfin ceci:

when {
    dateFrom != null -> params["lastUpdated"] = "$dateFrom,"
    dateTo != null -> params["lastUpdated"] = ",$dateTo"
    else -> Unit
}

Je pense que vous vouliez peut-être avoir: p >

when {
    dateFrom == null && dateTo == null -> Unit
    dateFrom != null -> params["lastUpdated"] = "$dateFrom,"
    dateTo != null -> params["lastUpdated"] = ",$dateTo"
}

Si c'est ce que vous vouliez, il n'y a aucun cas de simplification supplémentaire.


4 commentaires

L'autre est-il même nécessaire?


Pour le cas où les deux sont nuls, alors l'OP veut retourner explicitement Unit


Je pense que le but de la question est que l'OP ne veut pas renvoyer Unit . Il veut s'en débarrasser, comme si vous sautiez une itération dans une boucle en utilisant continue .


Si tel est le cas, le else peut être omis.



1
votes

Si vous réécrivez vos conditions, vous pouvez vous débarrasser du cas où vous avez maintenant Unit

when {
    dateFrom != null && dateTo != null -> params["lastUpdated"] = "$dateFrom,$dateTo"
    dateFrom != null                   -> params["lastUpdated"] = "$dateFrom,"
    dateTo != null                     -> params["lastUpdated"] = ",$dateTo"
}


0 commentaires