Начиная с 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)
, которое будет выбрано в проверенном режиме.