web-dev-qa-db-ja.com

Dart nullチェックイディオムまたはベストプラクティスとは何ですか?

次の形式の割り当てとnullチェックを使用して、マップでの二重検索を回避します。
Dartでこれを行うためのより良いまたはより慣用的な方法はありますか?

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

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;
}
_

_?._演算子は、左側がnullの場合はnullに短絡し、_??_演算子はnullでない場合は左側を返し、そうでない場合は右側を返します。

声明

_outgoing[a]?.contains(b)
_

したがって、_outgoing[a]_がnullの場合はnullに評価され、そうでない場合はcontains(b)のブール結果が評価されます。

つまり、結果のステートメントは次のいずれかになります。

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

inConnブール値にも同じことが当てはまります。つまり、inConnoutConnの両方がnullでないことが保証され、_||_ ingの結果を返すことができます。二。

69
Pixel Elephant

タイトルを検索してここにたどり着いたので、以下を投稿します。

https://github.com/Dart-lang/sdk/issues/66 によると、「Dartヌルチェックイディオムとベストプラクティスとは何ですか?」は:

一般的なケースでは、nullチェックのイディオムやベストプラクティスはありません。 nullを認識する演算子がケースに合わない場合は、if (object == null)またはif (object != null)のように直接比較を使用してください。

12
stanm