J'ai la forme suivante d'affectation et de vérifications nulles pour éviter les doubles recherches dans mes cartes.
Existe-t-il un moyen meilleur ou plus idiomatique de le faire dans Dart?
bool isConnected(a, b){
List list;
return (
((list = outgoing[a]) != null && list.contains(b)) ||
((list = incoming[a]) != null && list.contains(b))
);
}
À partir de Dart 1.12, des opérateurs à reconnaissance nulle sont disponibles pour ce type de situation:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
L'opérateur ?.
Court-circuite à null si le côté gauche est nul, et l'opérateur ??
Renvoie le côté gauche s'il n'est pas nul, et le côté droit sinon .
La déclaration
outgoing[a]?.contains(b)
sera donc évalué à null
si outgoing[a]
est null
, ou le résultat booléen de contains(b)
s'il ne l'est pas.
Cela signifie que la déclaration résultante sera l'une des suivantes:
bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true
Il en va de même pour le booléen inConn
, ce qui signifie que inConn
et outConn
sont garantis non nuls, ce qui nous permet de renvoyer le résultat de ||
les deux.
Publier ce qui suit, car je me suis retrouvé ici en recherchant le titre.
Selon https://github.com/Dart-lang/sdk/issues/66 , il semble que la réponse à "Quelle est l'idiome de vérification nulle de Dart ou la meilleure pratique?" est:
Il n'y a pas d'idiome de vérification nulle ou de meilleure pratique dans le cas général. Si les opérateurs sans valeur nulle ne correspondent pas à votre cas, utilisez la comparaison directe comme dans if (object == null)
ou if (object != null)
.