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
,它还包含 single
。 single
getter 对流也很有用,如果你只需要一个元素的话。考虑与 Stream
行相同的示例:
databaseConnection.query('SELECT * FROM xyz WHERE id=5').single.then((row) {
print('Process the row');
});
几天前,我注意到 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
,它还包含 single
。 single
getter 对流也很有用,如果你只需要一个元素的话。考虑与 Stream
行相同的示例:
databaseConnection.query('SELECT * FROM xyz WHERE id=5').single.then((row) {
print('Process the row');
});