Станом на Дарт 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), що перекине в перевіреному режимі.