A partir de Dart 1.12, los operadores con reconocimiento de nulos están 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 ?.
operador cortocircuita a nulo si el lado izquierdo es nulo, y el ??
operador devuelve el lado izquierdo si no es nulo y el lado derecho en caso contrario.
La declaración
outgoing[a]?.contains(b)
por lo tanto, evaluará null
si outgoing[a]
es null
, o el resultado booleano de contains(b)
si no es.
Eso significa que la declaración resultante será una de las siguientes:
bool outConn = null ?? false;
bool outConn = false ?? false;
bool outConn = true ?? false;
Lo mismo se aplica al inConn
booleano, lo que significa que ambos inConn
y outConn
están garantizados como no nulos, lo que nos permite devolver el resultado de ||
los dos.
outgoing[a]?.contains(b)
es peligroso, al menos con la semántica Groovy, porque cuandooutgoing
esnull
, toda la expresión se evalúa comonull
. Entonces, de hecho, podría obtener algo comoreturn (null || true)
, que se lanzará en modo verificado.