Ab Dart 1.12 sind nullbewusste Operatoren für diese Art von Situation verfügbar:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
Der ?.
Operator schließt auf Null kurz, wenn die linke Seite Null ist, und der ??
Operator gibt die linke Seite zurück, wenn sie nicht Null ist, und die rechte Seite ansonsten.
Die Aussage
outgoing[a]?.contains(b)
wird also entweder bewerten, null
ob es outgoing[a]
ist null
, oder das boolesche Ergebnis, contains(b)
wenn es nicht ist.
Das bedeutet, dass die resultierende Aussage eine der folgenden ist:
bool outConn = null ?? false;
bool outConn = false ?? false;
bool outConn = true ?? false;
Gleiches gilt für den inConn
Booleschen Wert, der beides bedeutet inConn
und outConn
garantiert nicht null ist, sodass wir das Ergebnis ||
der beiden zurückgeben können.
outgoing[a]?.contains(b)
ist gefährlich, zumindest bei der Groovy-Semantik, denn wenn dies der Falloutgoing
istnull
, wird der gesamte Ausdruck ausgewertetnull
. Sie könnten also tatsächlich so etwas bekommenreturn (null || true)
, was im aktivierten Modus ausgelöst wird.