我觉得很奇怪 Iterator::take_while
获得迭代器的所有权。能够采取第一个似乎是一个有用的功能 X 满足某些功能但仍保留原始迭代器中其余元素的元素。
我知道这与懒惰的实现不兼容 take_while
,但仍然觉得有用。这只是被判断为不足以包含在标准库中,还是还有其他一些我没有看到的问题?
我觉得很奇怪 Iterator::take_while
获得迭代器的所有权。能够采取第一个似乎是一个有用的功能 X 满足某些功能但仍保留原始迭代器中其余元素的元素。
我知道这与懒惰的实现不兼容 take_while
,但仍然觉得有用。这只是被判断为不足以包含在标准库中,还是还有其他一些我没有看到的问题?
为了效率,所有迭代器适配器都按值获取原始迭代器。此外,获取原始迭代器的所有权可避免在不必要时处理生命周期。
如果您希望保留对原始迭代器的访问权限,则可以使用 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
。