1. ホーム
  2. dart

[解決済み] DartのNULLチェックのイディオムやベストプラクティスは何ですか?

2022-10-30 15:47:53

質問

マップの二重検索を避けるために、以下のような代入&NULLチェックの形式をとっています。

Dartでこれを行うより良いまたはより慣用的な方法はありますか?

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

どのように解決するのですか?

Dart 1.12では、このような状況に対してnull-awareオペレータが利用可能です。

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

?. 演算子は,左辺が NULL の場合は NULL に短絡し,右辺が NULL の場合は ?? 演算子は左辺がNULLでなければ左辺を、そうでなければ右辺を返します。

文は

outgoing[a]?.contains(b)

は以下のように評価されます。 null もし outgoing[a]null のブーリアン演算の結果である。 contains(b) でない場合は

つまり、結果の文は以下のいずれかになります。

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

同じことが inConn ブーリアンであり、これは両方の inConnoutConn は非NULLであることが保証されており、その結果 || の結果を返すことができます。