Що таке ідіома перевірки нуля Dart чи найкраща практика?


86

У мене є така форма призначення та перевірки нуля, щоб уникнути подвійного пошуку на моїх картах.
Чи є кращий чи більш ідіоматичний спосіб зробити це в Дарті?

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

Відповіді:


120

Станом на Дарт 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логічного значення, що означає обидва inConnі outConnгарантовано буде ненульовим, що дозволить нам повернути результат введення ||двох.


Писати outgoing[a]?.contains(b)небезпечно, принаймні з семантикою Groovy, оскільки коли outgoingє null, цілий вираз має значення null. Отже, ви могли б насправді отримати щось на зразок того return (null || true), що перекине в перевіреному режимі.
Ладічек

Дякуємо за посилання з відкритим випуском.
z5h

@Ladicek Дякую, що вказали на це. Я включив оператор нульового злиття ( ??) до своєї оновленої відповіді, щоб пояснити цю проблему.
Pixel Elephant


Щоб перевірити поля об'єктів, просто напишіть object?.field ?? true. Де справжнім може бути все, що ти хочеш.
Тіло

51

Зараз існує 4 оператори, що знають нуль

?? надає значення за замовчуванням, якщо тема нульова

return subject ?? "defaultIfNull";

?? = встановлює тему за замовчуванням, лише якщо тема нульова

Це схоже на ?? але встановлює для змінної теми значення за замовчуванням, якщо воно є нульовим.

subject ??= "defaultIfNull";

?. уникайте винятку, якщо тема є нульовою при доступі до властивості суб’єкта

object?.xповерне значення null, якщо об'єкт має значення null, object.xспричинить виняток, якщо об'єкт має значення null

...? з колекції розповсюджень уникайте нульового елемента в остаточному списку, якщо список тем є нульовим

результат наступного

[
  ...[1, 2],
  null,
]

є [1, 2, null]

щоб уникнути використання нульового значення ...?

var resultingList = [
  ...[1, 2],
  ...?subjectList,
];

2
Важливе зауваження щодо використання ? : якщо посилання aз нульовим значенням має метод void method(), наступний синтаксис a?.method();буде виконувати метод, лише якщо aне є null.
Алекс Семенюк

@AlexSemeniuk, чудова думка! але чи є спосіб зробити щось подібне >>>, якщо a не має значення null ... тоді виконайте метод XYZ (), коли цей метод не є членом класу об'єкта a ???
Yo Apps

@YoApps Чи я зрозумів, що ви хочете виконати метод, який не є частиною підпису класу? Це неможливо зробити жодною мовою ООП, яку я знаю.
Олексій Семенюк,

@AlexSemeniuk так, я теж спробував, не працював, тому повернувся до старогоif(a!=null){XYZ();}
Yo Apps

1
@YoApps. О, ви маєте на увазі цей код. Ні, це не можна в Дарті.
Олексій Семенюк

15

Опублікувавши наступне, оскільки я опинився тут, шукаючи заголовок.

Відповідно до https://github.com/dart-lang/sdk/issues/66 , здається, що відповідь на "Що таке ідіома перевірки нуля Dart чи найкраща практика?" це:

У загальному випадку немає жодної ідіоми перевірки чи найкращої практики. Якщо нульові оператори не відповідають вашому випадку, використовуйте пряме порівняння, як у if (object == null)або if (object != null).


1
зараз у них є
Олівер Діксон,

0
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення. Як відповісти . З повагою.
Elletlar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.