问题 为什么Iterator :: take_while取得迭代器的所有权?


我觉得很奇怪 Iterator::take_while 获得迭代器的所有权。能够采取第一个似乎是一个有用的功能 X 满足某些功能但仍保留原始迭代器中其余元素的元素。

我知道这与懒惰的实现不兼容 take_while,但仍然觉得有用。这只是被判断为不足以包含在标准库中,还是还有其他一些我没有看到的问题?


10938
2017-07-13 00:48


起源



答案:


为了效率,所有迭代器适配器都按值获取原始迭代器。此外,获取原始迭代器的所有权可避免在不必要时处理生命周期。

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

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);
    }
}

有输出

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

你注意到了吗 4 失踪?那是因为曾经 take_while 选择一个值并决定不使用它,没有任何地方可以“放回去”。把它放回去需要选择 更多 存储和缓慢比总是需要的。

我用过了 itertools箱子 特别是处理这样的案件 take_while_ref


13
2017-07-13 00:53