我有一个过滤的迭代器,如下所示:
let filt_it = a_vector.iter().filter(|x| condition_on_x);
Run Code Online (Sandbox Code Playgroud)
有没有办法找出它是否为空?
我需要迭代器保持迭代器以备后用,而且似乎无法克隆过滤的迭代器。
您可以使您的迭代器peekable和peek第一项; 如果为None,则迭代器为空。peek不会消耗项目1,因此对的下一次调用next将返回它。但是,由于peekable消耗了迭代器,因此您必须传递Peekable- Peekable还是an Iterator,因此,如果您的代码期望使用an Iterator或an IntoIterator,它将可以正常工作。
let filt_it = a_vector.iter().filter(|x| condition_on_x).peekable();
if filt_it.peek().is_some() {
// The iterator is not empty, process it.
process(filt_it);
}
Run Code Online (Sandbox Code Playgroud)
FilterClone在iterator和predicate函数都为时实现Clone。问题是,从Rust 1.23.0开始,闭包没有实现Clone。您可以在每夜编译器上启用功能,以便可以进行关闭Clone。
1如果您peekable使用对迭代器的可变引用进行调用,则实际上可以在删除之后保留原始迭代器Peekable。但是,如果您peek在删除之前进行了调用Peekable,则会看到它实际上消耗了原始迭代器中的第一项。那是完全正常的;Iterator本身不提供窥视的界面。Peekable将存储被偷看的项目,因此可以在对的后续调用中将其返回next,但是如果删除Peekable,则该存储的项目也将被删除。
| 归档时间: |
|
| 查看次数: |
1586 次 |
| 最近记录: |