Kể từ Dart 1.12, các toán tử không nhận biết có sẵn cho loại tình huống này:
bool isConnected(a, b) {
bool outConn = outgoing[a]?.contains(b) ?? false;
bool inConn = incoming[a]?.contains(b) ?? false;
return outConn || inConn;
}
Các ?.
nhà khai thác ngắn mạch để null nếu phía bên trái tay là null, và các ??
nhà điều hành trả về bên trái tay nếu nó không phải là null, và phía bên tay phải ngược lại.
Tuyên bố
outgoing[a]?.contains(b)
do đó sẽ đánh giá null
nếu outgoing[a]
là null
, hoặc kết quả boolean của contains(b)
nếu nó không.
Điều đó có nghĩa là câu lệnh kết quả sẽ là một trong những câu sau:
bool outConn = null ?? false;
bool outConn = false ?? false;
bool outConn = true ?? false;
Điều tương tự cũng áp dụng cho inConn
boolean, có nghĩa là cả hai inConn
và outConn
đều được đảm bảo là khác rỗng, cho phép chúng tôi trả về kết quả của ||
việc nhập cả hai.
outgoing[a]?.contains(b)
là nguy hiểm, ít nhất là với ngữ nghĩa Groovy, bởi vì khi nàooutgoing
thìnull
toàn bộ biểu thức sẽ đánh giánull
. Vì vậy, trên thực tế, bạn có thể nhận được một cái gì đó giống nhưreturn (null || true)
, sẽ chuyển sang chế độ đã chọn.