Что такое Дарт, проверяющий идиому или лучшую практику?
У меня есть следующая форма назначения и нулевые проверки, чтобы избежать двойного поиска на моих картах.
Есть ли лучший или более идиоматический способ сделать это в Дарте?
bool isConnected(a, b){
List list;
return (
((list = outgoing[a]) != null && list.contains(b)) ||
((list = incoming[a]) != null && list.contains(b))
);
}
Ответы
Ответ 1
Начиная с 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; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true
То же самое относится к inConn
boolean, что означает, что как inConn
, так и outConn
гарантированы не равными нулю, что позволяет нам вернуть результат ||
из двух.
Ответ 2
Публикуя следующее, как я попал сюда в поиске по названию.
Что касается https://github.com/dart-lang/sdk/issues/66, кажется, что ответ на вопрос "Что такое идиома проверки дротика на ноль или лучшая практика?" является:
В общем случае не существует идиомы проверки нуля или наилучшей практики. Если нулевые операторы не соответствуют вашему случаю, используйте прямое сравнение, как в if (object == null)
или if (object != null)
.
Ответ 3
В настоящее время существует 4 оператора с нулевым кодом
?? обеспечивает значение по умолчанию, если тема имеет нулевое значение
return subject ?? "defaultIfNull";
?? = устанавливает тему по умолчанию, только если тема нулевая
Это похоже на?? но устанавливает переменную объекта по умолчанию, если она равна нулю.
subject ??= "defaultIfNull";
?. избегать исключения, если тема имеет значение null при доступе к свойству объекта
object?.x
вернет ноль, если объект нулевой, object.x
вызовет исключение, если объект нулевой
...? из развёрнутой коллекции избегайте нулевого элемента в окончательном списке, если список тем равен нулю
результат следующего
[
...[1, 2],
null,
]
is [1, 2, null]
чтобы избежать использования нулевого значения...?
var resultingList = [
...[1, 2],
...?subjectList,
];