2013-06-09 3 views
13

私はマップ内でダブルルックアップを避けるために、以下の形式の割り当てを&ヌルチェックしています。
Dartでこれを行うには、より良い方法や慣用的な方法がありますか?ダーツヌルチェックのイディオムまたはベストプラクティスとは何ですか?

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

答えて

18
ダートのよう

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でない場合は左側を返し、そうでない場合は右側を返します。そうでない場合outgoing[a]null、またはcontains(b)のブール結果である場合

声明

outgoing[a]?.contains(b) 

は、このようにどちらかがnullと評価されます。

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

同じは私たちが返すようにできるように、inConnoutConnの両方が非nullであることが保証されることを意味inConnブール、に適用されます。結果の文は、次のいずれかになります意味

その結果は||となります。

+0

'outgoing [a] ?. containsを書くことは、少なくともGroovyのセマンティクスでは危険です。なぜなら、' outgoing'が 'null'のとき、式全体が' null'と評価されるからです。したがって、実際には 'return(null || true)'のようなものを取得して、チェックモードで投げてしまうかもしれません。 – Ladicek

+0

未解決の問題のリンクをありがとう。 – z5h

+0

@Ladicekそれを指摘してくれてありがとう。私はその問題を説明する私の更新された答えにnull合体演算子( '?')を組み込みました。 –

3

私はここでタイトルを検索して、次のように投稿しました。

https://github.com/dart-lang/sdk/issues/66によると、「ダーツヌルチェックのイディオムまたはベストプラクティスとは何ですか?」という回答があるようです。次のとおりです。

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

関連する問題