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, nullczy 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 inConnlogicznej, co oznacza, że oba inConni outConnmają 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ż kiedyoutgoingjestnull, całe wyrażenie ocenia się donull. Więc w rzeczywistości możesz dostać coś takiegoreturn (null || true), co wrzuci tryb zaznaczenia.