Od wersji Dart 1.12 operatory obsługujące wartość null są dostępne dla tego typu sytuacji:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
Do ?.
zwarcia operatorowi NULL jeżeli po lewej stronie jest null, a ??
operator zwraca lewej strony, jeśli to nie jest zerowa, a po prawej stronie inaczej.
Twierdzenie
outgoing[a]?.contains(b)
w ten sposób oszacuje, null
czy outgoing[a]
jest null
, lub jako wynik boolowski, contains(b)
jeśli tak nie jest.
Oznacza to, że wynikowa instrukcja będzie jedną z następujących:
bool outConn = null ?? false;
bool outConn = false ?? false;
bool outConn = true ?? false;
To samo dotyczy wartości inConn
logicznej, co oznacza, że oba inConn
i outConn
mają gwarantowaną wartość różną od zera, co pozwala nam zwrócić wynik ||
tych dwóch.
outgoing[a]?.contains(b)
jest niebezpieczne, przynajmniej w przypadku semantyki Groovy'ego, ponieważ kiedyoutgoing
jestnull
, całe wyrażenie ocenia się donull
. Więc w rzeczywistości możesz dostać coś takiegoreturn (null || true)
, co wrzuci tryb zaznaczenia.