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

What is the main purpose of List.single property?

几天前,我注意到 Dart 的列表 class 有 single 属性。然后,我看了一个官方的API文档,明白了这个属性是怎么工作的。这意味着我知道 List.single 的工作原理如下:

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

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

属性 的目的是什么?如果 List 包含两个或更多元素,为什么 属性 会抛出异常?为什么不是 boolean 属性 表示 List 是否只有一个元素? Dart Language 开发者认为在核心 API 中包含 List.single 有什么用?

如果您对此有任何了解,请帮助我。

如果您希望 Iterable 仅包含一个元素,则可以使用 single。这是一个真实世界的例子: 我们的数据库连接具有 query 方法来执行 SQL 查询。方法 returns 受查询影响的行。现在考虑一个查询,您只希望其中一行受到影响:

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,它还包含 singlesingle getter 对流也很有用,如果你只需要一个元素的话。考虑与 Stream 行相同的示例:

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