前几天,我注意到Dart的List类具有single
属性。然后,我阅读了官方API文档,并了解了此属性的工作原理。这意味着我知道List.single
的工作原理如下:
print(['a'].single); // outputs 'a'
print(['a', 'b'].single) // throws StateError
但我找不到single
属性的任何实际用例。当然,上面显示的幼稚代码在实际编程中毫无意义。
该物业的目的是什么?如果List包含两个或更多元素,为什么此属性会抛出异常?为什么它不是一个布尔属性,它代表List是否只有单个元素? Dart语言开发人员如何认为将List.single
包含在核心API中是有用的?
如果你对此有任何了解,如果你帮我一把,我将非常感激。
答案 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');
});