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