Подтвердить что ты не робот

Что такое Дарт, проверяющий идиому или лучшую практику?

У меня есть следующая форма назначения и нулевые проверки, чтобы избежать двойного поиска на моих картах.
Есть ли лучший или более идиоматический способ сделать это в Дарте?

bool isConnected(a, b){
  List list;
  return (
    ((list = outgoing[a]) != null && list.contains(b)) ||
    ((list = incoming[a]) != null && list.contains(b))
  );
}
4b9b3361

Ответ 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,
];