web-dev-qa-db-fra.com

Qu'est-ce que l'idiome de vérification nulle de Dart ou la meilleure pratique?

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))
  );
}
43
z5h

À 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.

69
Pixel Elephant

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).

12
stanm