2015-01-06 4 views
6

数日前、ダーツのListクラスにsingleというプロパティがあることに気付きました。次に、公式のAPIドキュメントを読み、このプロパティがどのように機能するかを理解しました。List.singleプロパティの主な目的は何ですか?

print(['a'].single);  // outputs 'a' 
print(['a', 'b'].single) // throws StateError 

しかし、私はsingleプロパティのいずれかの実用的なユースケースを見つけることができませんを次のように、この平均値は、私はそのList.single作品を知っています。上に示した子どものコードは実際のプログラミングでは意味をなさない。

プロパティの目的は何ですか?リストに2つ以上の要素が含まれていると、このプロパティが例外をスローするのはなぜですか? Listが単一の要素しか持たないかどうかを表すbooleanプロパティではないのはなぜですか? Dart言語の開発者は、List.singleをコアAPIに含めると便利だとどのように考えていますか?

これについて何か知っていれば、私に手を差し伸べていただければ幸いです。

+0

Mmmm ...テスト? https://github.com/dart-lang/bleeding_edge/blob/80988a506bdf74d2e87bf0d7e1211d035c2e5624/dart/tests/corelib/iterable_single_test.dart – JAre

答えて

5

singleは、Iterableに1つの要素しか含まれていないと思われる場合に使用できます。現実世界の例を次に示します。 SQLクエリを実行するためのqueryメソッドを持つデータベース接続があります。このメソッドは、クエリの影響を受ける行を返します。

var row = databaseConnection.query('SELECT * FROM xyz WHERE id=5').single; 

これが影響を受けていない以上、その後一行場合に失敗の短い方法を提供します:今、あなただけ正確に1行が影響を受けると予想されるクエリを考えてみます。もちろん、次のように書くこともできます:

var rows = databaseConnection.query('SELECT * FROM xyz WHERE id=5'); 

if (rows.length != 1) { 
    throw new StateError('Something is wrong'); 
} 

var row = rows.first; 

これはずっと長くなります。あるいは、assertにすることもできます。

ListIterableを実装し、singleも含んでいます。 singleゲッターは、正確に1つの要素が必要な場合は、ストリームにも役立ちます。行のStreamと同じ例を考えてみましょう:

databaseConnection.query('SELECT * FROM xyz WHERE id=5').single.then((row) { 
    print('Process the row'); 
}); 
+0

ありがとうございました!理解するのはとても簡単です。私はそれが抽出されたレコードを表明するための省略表現として機能することを見落としていました。 –

関連する問題