List.single属性的主要用途是什么?

时间:2015-01-06 09:47:29

标签: dart

前几天,我注意到Dart的List类具有single属性。然后,我阅读了官方API文档,并了解了此属性的工作原理。这意味着我知道List.single的工作原理如下:

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

但我找不到single属性的任何实际用例。当然,上面显示的幼稚代码在实际编程中毫无意义。

该物业的目的是什么?如果List包含两个或更多元素,为什么此属性会抛出异常?为什么它不是一个布尔属性,它代表List是否只有单个元素? Dart语言开发人员如何认为将List.single包含在核心API中是有用的?

如果你对此有任何了解,如果你帮我一把,我将非常感激。

1 个答案:

答案 0 :(得分:5)

如果您希望Iterable只包含一个元素,则可以使用single。这是一个真实世界的例子: 我们有数据库连接,具有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 getter对于流也很有用。考虑与Stream行相同的示例:

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