110

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

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

4 に答える 4

155

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)

したがって、nullif outgoing[a]isに評価されるか、 if it is notnullのブール結果に評価されます。contains(b)

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

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

inConn同じことがboolean にも当てはまります。つまり、inConnとの両方outConnが null でないことが保証されているため、||この 2 つを ing した結果を返すことができます。

于 2013-06-09T06:13:38.797 に答える
18

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

https://github.com/dart-lang/sdk/issues/66によると、「Dart null チェックのイディオムまたはベストプラクティスとは何ですか?」に対する答えのようです。は:

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

于 2016-12-22T16:59:06.503 に答える