Dart null 검사 관용구 또는 모범 사례는 무엇입니까?


82

내지도에서 이중 조회를 피하기 위해 다음과 같은 형식의 할당 및 null 검사가 있습니다.
Dart에서 이것을 수행하는 더 나은 또는 더 관용적 인 방법이 있습니까?

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

답변:


116

Dart 1.12부터는 다음과 같은 상황에서 null 인식 연산자를 사용할 수 있습니다.

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)

따라서 nullif outgoing[a]is로 평가 null되거나 그렇지 않으면 부울 결과로 평가됩니다 contains(b).

즉, 결과 문은 다음 중 하나가됩니다.

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

inConn부울 에도 동일하게 적용됩니다. 즉, inConn및 둘 다 outConnnull이 아닌 것이 보장되므로 둘 다 결과를 반환 할 수 있습니다 ||.


쓰기는 outgoing[a]?.contains(b)경우 때문에, 적어도 그루비 의미로, 위험 outgoing하다 null,에 전체 표현식의 평가됩니다 null. 따라서 실제로 return (null || true)체크 모드에서 던질.
Ladicek 2013-06-09

열린 문제 링크에 감사드립니다.
z5h

@Ladicek 지적 해 주셔서 감사합니다. ??이 문제를 설명하기 위해 업데이트 된 답변에 null 통합 연산자 ( )를 통합 했습니다.
Pixel Elephant


객체의 필드를 확인하려면 object?.field ?? true. 진실은 당신이 원하는 모든 것이 될 수 있습니다.
Tilo

42

이제 4 개의 널 인식 연산자가 있습니다.

?? 제목이 null 인 경우 기본값을 제공합니다.

return subject ?? "defaultIfNull";

?? = 제목이 null 인 경우에만 제목을 기본값으로 설정합니다.

이것은 ?? 그러나 null 인 경우 주제 변수를 기본값으로 설정합니다.

subject ??= "defaultIfNull";

?. 주체의 속성에 액세스 할 때 주체가 null이면 예외를 피하십시오.

object?.x객체가 null이면 null을 반환 object.x하고, 객체가 null이면 예외를 발생시킵니다.

...? 스프레드 컬렉션에서 제목 목록이 null 인 경우 최종 목록에서 null 항목을 피하십시오.

다음의 결과

[
  ...[1, 2],
  null,
]

이다 [1, 2, null]

null 값을 사용하지 않으려면 ...?

var resultingList = [
  ...[1, 2],
  ...?subjectList,
];

2
사용에 대한 중요 사항 ?. : nullable 참조 a에 void method method()가있는 경우 다음 구문 a?.method();anull이 아닌 경우에만 메서드를 실행 합니다.
Alex Semeniuk 2019

@AlexSemeniuk, 좋은 지적! 하지만 a가 null이 아닌 경우 이와 같은 작업을 수행 할 수있는 방법이 있습니까?
Yo Apps

@YoApps 클래스 서명의 일부가 아닌 메서드를 실행하고 싶다는 것이 분명 했습니까? 내가 아는 OOP 언어로는 불가능합니다.
Alex Semeniuk

@AlexSemeniuk 그래 나도 시도했지만 작동하지 않았기 때문에 이전으로 되 돌렸다if(a!=null){XYZ();}
Yo Apps

1
@YoApps. 오,이 코드를 의미합니다. 아니요, Dart에서는 불가능합니다.
Alex Semeniuk

14

제목을 검색하여 여기에 올 때 다음을 게시합니다.

https://github.com/dart-lang/sdk/issues/66에 따라 "Dart null 검사 관용구 또는 모범 사례는 무엇입니까?"에 대한 대답 인 것 같습니다. is :

일반적인 경우에는 null 검사 관용구 또는 모범 사례가 없습니다. 널 인식 연산자가 귀하의 경우에 맞지 않으면 if (object == null)또는 에서와 같이 직접 비교를 사용하십시오 if (object != null).


1
그들은 :-) 지금 선택적 항목을
올리버 딕슨

0
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;

이 코드가 질문에 답할 수 있지만,이 코드가 질문에 답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다. 답변 방법 . 종류 안부.
Elletlar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.