114 votes

Quel est l'idiome ou la meilleure pratique de vérification des nullités dans Dart ?

J'utilise la forme suivante de contrôles d'affectation et de nullité pour éviter les doubles vérifications dans mes cartes.
Existe-t-il un moyen plus efficace ou plus idiomatique de faire cela en Dart ?

bool isConnected(a, b){
  List list;
  return (
    ((list = outgoing[a]) != null && list.contains(b)) ||
    ((list = incoming[a]) != null && list.contains(b))
  );
}

159voto

Pixel Elephant Points 6902

Depuis la version 1.12 de Dart, des opérateurs null-aware 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;
}

Le site ?. se court-circuite en nullité si le côté gauche est nul, et l'opérateur ?? 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 soit évalué à null si outgoing[a] es null ou le résultat booléen de contains(b) si ce n'est pas le cas.

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 inConn booléen, ce qui signifie que les deux inConn y outConn sont garantis non nuls, ce qui nous permet de retourner le résultat de || les deux.

105voto

Twisted Inferno Points 462

Il y a maintenant 4 opérateurs conscients de la nullité

? ? fournit un défaut si le sujet est nul

return subject ?? "defaultIfNull";

??= définit le sujet par défaut uniquement si le sujet est nul

C'est similaire à ? ? mais définit la variable sujet par défaut si elle est nulle.

subject ??= "defaultIfNull";

?. éviter une exception, retourner null ou ne pas exécuter la fonction/méthode si l'objet à gauche est null

object?.x retournera null si l'objet est null, object.x provoquerait une exception si l'objet était nul

Ceci peut également être utilisé lors de l'appel de méthodes. Par exemple

pour les méthodes d'annulation, object?.myVoidMethod() - si object est nulle, alors myVoidMethod ne s'exécutera pas.

et pour les méthodes qui renvoient des valeurs object?.returnValueMethod() - si object est nulle, alors returnValueMethod retournera null.

Il peut également être utilisé avec des appels de fonction avec la fonction call opérateur. Par exemple myCallbackFunction?.call() ne s'exécutera que si maFonction n'est pas nulle.

... ? à partir d'une collection étalée, éviter un élément nul dans la liste finale si la liste des sujets est nulle

le résultat de ce qui suit

[
  ...[1, 2],
  null,
]

est [1, 2, null]

pour éviter l'utilisation de la valeur nulle ... ?

var resultingList = [
  ...[1, 2],
  ...?subjectList,
];

18voto

stanm Points 170

Je poste ce qui suit, car j'ai atterri ici en cherchant le titre.

Conformément à https://github.com/dart-lang/sdk/issues/66 il semble que la réponse à la question "Quel est l'idiome ou la meilleure pratique de vérification des nullités en Dart ?

Il n'existe pas d'idiome de vérification des nullités ni de meilleure pratique dans le cas général. Si les opérateurs null-aware ne conviennent pas à votre cas, utilisez la comparaison directe comme dans if (object == null) ou if (object != null) .

3voto

binarez Points 619
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X