2015-01-06 2 views
6

Несколько дней назад я заметил, что класс List Dart имеет свойство single. Затем я прочитал официальный документ API и понял, как это свойство работает. Это означает, что я знаю, что List.single работает следующим образом:Какова основная цель свойства List.single?

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

Но я не могу найти какого-либо практического использования случай single имущества. Конечно, детские коды, показанные выше, не имеют никакого смысла в реальном программировании.

Что является целью недвижимости? Почему это свойство выдает исключение, если список содержит два или более элемента? Почему это не логическое свойство, которое означает, что List имеет только один элемент? Как разработчики Dart Language считают полезным включить в базовый API List.single?

Если у вас есть какие-либо знания об этом, я был бы очень признателен, если вы дадите мне руку.

+0

Mmmm ... Тестирование? https://github.com/dart-lang/bleeding_edge/blob/80988a506bdf74d2e87bf0d7e1211d035c2e5624/dart/tests/corelib/iterable_single_test.dart – JAre

ответ

5

Вы можете использовать single, если вы ожидаете, что Iterable будет содержать только один элемент. Вот пример реального мира: У нас есть соединение с базой данных, которое имеет метод query для выполнения SQL-запросов. Метод возвращает строки, затронутые запросом. Теперь рассмотрим запрос, где вы только ожидаете именно одна линия, будут затронуты:

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

Это дает короткий путь неудачу в случае нет или более одной линии затронуты. Конечно, также можно написать:

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.

Как List инвентарь Iterable, он также содержит single. Гнестер single также полезен для потоков, если вы ожидаете ровно один элемент. Рассмотрим тот же пример, что и Stream строк:

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

Большое спасибо! Это очень легко понять. Я упустил из виду, что это работает как сокращение для утверждения извлеченных записей. –

Смежные вопросы