tutorial - dart vs javascript
¿Qué es el idioma de comprobación nula de Dart o las mejores prácticas? (2)
A partir de Dart 1.12, hay operadores con capacidad nula disponibles para este tipo de situación:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
El ?.
el operador cortocircuita a nulo si el lado izquierdo es nulo, y el ??
el operador devuelve el lado izquierdo si no es nulo, y el lado derecho de lo contrario.
La declaración
outgoing[a]?.contains(b)
por lo tanto, se evaluará como null
si outgoing[a]
es null
, o el resultado booleano de contains(b)
si no lo es.
Eso significa que la declaración resultante será una de las siguientes:
bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true
Lo mismo se aplica al booleano de inConn
, lo que significa que se garantiza que tanto inConn
como outConn
no son nulos, lo que nos permite devolver el resultado de ||
los dos.
Tengo la siguiente forma de asignación y controles nulos para evitar búsquedas dobles en mis mapas.
¿Hay alguna forma mejor o más idiomática de hacer esto en Dart?
bool isConnected(a, b){
List list;
return (
((list = outgoing[a]) != null && list.contains(b)) ||
((list = incoming[a]) != null && list.contains(b))
);
}
Publicando lo siguiente, ya que terminé aquí buscando el título.
Según https://github.com/dart-lang/sdk/issues/66 , parece que la respuesta a "¿Qué es el idioma de comprobación nula de Dart o la mejor práctica?" es:
No hay ningún idioma de comprobación nula o la mejor práctica en el caso general. Si los operadores conscientes de nulos no encajan en su caso, use la comparación directa como en if (object == null)
o if (object != null)
.