关于rust:为什么Iterator :: take_while拥有迭代器的所有权?

Why does Iterator::take_while take ownership of the iterator?

我发现Iterator::take_while拥有迭代器的所有权很奇怪。 能够采用满足某些功能但仍保留原始迭代器中其余元素可用的前x个元素似乎是一项有用的功能。

我知道这与take_while的惰性实现不兼容,但仍然感觉有用。 难道这只是被判断为不够有用,不能包含在标准库中,还是我没有看到其他问题?


为了效率起见,所有迭代器适配器都按值采用原始迭代器。 此外,拥有原始迭代器的所有权避免了不必要地处理生命周期。

如果您希望保留对原始迭代器的访问权限,则可以使用by_ref。 这引入了一种间接性,但是程序员在需要该功能时选择参加额外的工作:

1
2
3
4
5
6
7
8
9
10
11
12
fn main() {
    let v = [1, 2, 3, 4, 5, 6, 7, 8];
    let mut i1 = v.iter();
    for z in i1.by_ref().take_while(|&&v| v < 4) {
    //         ^^^^^^^^^
        println!("Take While: {}", z);
    }

    for z in i1 {
        println!("Rest: {}", z);
    }
}

有输出

1
2
3
4
5
6
7
Take While: 1
Take While: 2
Take While: 3
Rest: 5
Rest: 6
Rest: 7
Rest: 8

您是否注意到缺少4? 这是因为一旦take_while选择了一个值并决定不使用它,就没有地方"放回它"。 放回原处将需要选择比以往任何时候都更多的存储和速度。

我使用过itertools板条箱来处理这种情况,特别是take_while_ref