2013-06-09 11 views
13

Tôi có dạng chuyển nhượng sau đây & kiểm tra không để tránh tra cứu kép trong bản đồ của tôi.
Có cách nào tốt hơn hoặc thành ngữ hơn để thực hiện điều này trong Dart không?Thành phần phi tiêu đề kiểm tra null hoặc thực hành tốt nhất là gì?

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

Trả lời

18

Tính đến Dart 1.12 nhà khai thác vô-aware có sẵn cho loại tình huống:

bool isConnected(a, b) { 
    bool outConn = outgoing[a]?.contains(b) ?? false; 
    bool inConn = incoming[a]?.contains(b) ?? false; 
    return outConn || inConn; 
} 

Các ?. điều hành ngắn mạch null nếu phía bên tay trái là null, và ?? toán tử trả về phía bên trái 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) 

sẽ do một trong hai đánh giá để null nếu outgoing[a]null, hoặc kết quả boolean của contains(b) nếu nó không phải là.

đó có nghĩa là tuyên bố kết quả sẽ là một trong những điều sau đây:

bool outConn = null ?? false; // false 
bool outConn = false ?? false; // false 
bool outConn = true ?? false; // true 

Cùng áp dụng cho inConn boolean, có nghĩa là cả hai inConnoutConn có bảo đảm là không null, cho phép chúng tôi trở lại kết quả của || nhập hai.

+0

Viết 'outgoing [a] ?. chứa (b)' là nguy hiểm, ít nhất với ngữ nghĩa Groovy, bởi vì khi 'outgoing' là' null', toàn bộ biểu thức ước lượng thành 'null'. Vì vậy, bạn có thể trong thực tế nhận được một cái gì đó giống như 'return (null || true)', mà sẽ ném trong chế độ kiểm tra. – Ladicek

+0

Cảm ơn bạn đã liên kết vấn đề mở. – z5h

+0

@Ladicek Cảm ơn bạn đã chỉ ra điều đó. Tôi đã kết hợp toán tử kết hợp null ('??') vào câu trả lời được cập nhật của tôi để giải thích cho vấn đề đó. –

3

Đăng nội dung sau đây, vì tôi đã kết thúc ở đây bằng cách tìm kiếm tiêu đề.

Theo https://github.com/dart-lang/sdk/issues/66, có vẻ như câu trả lời cho "Thành ngữ kiểm tra null phi tiêu hoặc thực tiễn tốt nhất là gì?" là:

Không có thành ngữ kiểm tra null hoặc thực tiễn tốt nhất trong trường hợp chung. Nếu các toán tử nhận biết null không phù hợp với trường hợp của bạn, hãy sử dụng so sánh trực tiếp như trong if (object == null) hoặc if (object != null).