Начиная с Dart 1.12, для этого типа ситуаций доступны нулевые операторы:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
В ?.операторе короткое замыкание в нуль , если левая сторона имеет нулевое значение, а ??оператор возвращает сторону левой руки , если он не пустой, а правая сторона в противном случае.
Заявление
outgoing[a]?.contains(b)
Таким образом, будет либо оцениваться, nullесли outgoing[a]есть null, либо логический результат, contains(b)если это не так.
Это означает, что результирующий оператор будет одним из следующих:
bool outConn = null ?? false;
bool outConn = false ?? false;
bool outConn = true ?? false;
То же самое относится к inConnлогическому, что означает, что оба inConnи outConnгарантированно не равны нулю, что позволяет нам возвращать результат их обработки ||.
outgoing[a]?.contains(b)опасно, по крайней мере, с семантикой Groovy, потому что когдаoutgoingестьnull, все выражение оценивается какnull. Таким образом, вы действительно можете получить что-то вродеreturn (null || true), которое будет выбрано в проверенном режиме.