Начиная с 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;
bool outConn = false ?? false;
bool outConn = true ?? false;
То же самое относится к inConn
логическому, что означает, что оба inConn
и outConn
гарантированно не равны нулю, что позволяет нам возвращать результат их обработки ||
.
outgoing[a]?.contains(b)
опасно, по крайней мере, с семантикой Groovy, потому что когдаoutgoing
естьnull
, все выражение оценивается какnull
. Таким образом, вы действительно можете получить что-то вродеreturn (null || true)
, которое будет выбрано в проверенном режиме.??
) в свой обновленный ответ, чтобы учесть эту проблему.object?.field ?? true
. Где правда, может быть все, что угодно.Теперь есть 4 оператора с нулевым значением
?? предоставляет значение по умолчанию, если тема пуста
return subject ?? "defaultIfNull";
?? = устанавливает тему по умолчанию, только если тема пуста
Это похоже на ?? но устанавливает для переменной субъекта значение по умолчанию, если оно равно нулю.
subject ??= "defaultIfNull";
? избегать исключения, если объект имеет значение null при доступе к свойству субъекта
object?.x
вернет null, если объект имеет значение null,object.x
вызовет исключение, если объект имеет значение null...? из коллекции распространения, избегайте нулевого элемента в окончательном списке, если список тем пуст
результат следующего
[ ...[1, 2], null, ]
является
[1, 2, null]
чтобы избежать использования нулевого значения ...?
var resultingList = [ ...[1, 2], ...?subjectList, ];
источник
a
имеет метод voidmethod()
, следующий синтаксисa?.method();
выполнит метод, только еслиa
он не равен NULL.if(a!=null){XYZ();}
Публикуя следующее, поскольку я оказался здесь, выполнив поиск по названию.
Согласно https://github.com/dart-lang/sdk/issues/66 , кажется, что это ответ на вопрос «Что такое идиома проверки нуля в Dart или передовая практика?» является:
В общем случае не существует идиомы нулевой проверки или передового опыта. Если операторы с нулевым значением не подходят для вашего случая, используйте прямое сравнение, например
if (object == null)
илиif (object != null)
.источник
bool ok<T>(T obj) => obj != null; bool nul<T>(T obj) => obj == null;
источник