- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从表面上看,两者都像drain
和 into_iter
提供类似的迭代器,即遍历集合的值。然而,它们是不同的:
fn main() {
let mut items1 = vec![0u8, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let items2 = items1.clone();
println!("{:?}", items1.drain().count());
println!("{:?}", items2.into_iter().count());
println!("{:?}", items1);
// println!("{:?}", items2); Moved
}
drain
将 &mut
带到集合中,之后集合可用。 into_iter
使用集合。每个迭代器的适当用途是什么?
最佳答案
它们之间有些冗余。但是,正如您所说,Drain
只是借用了 vector,特别是,它具有与 vector 相关的生命周期。如果希望返回一个迭代器,或者以最灵活的方式修改迭代器,使用 into_iter
会更好,因为它没有链接到原始 Vec
的所有者.如果希望重用数据结构(例如重用分配),那么 drain
是最直接的方法。
此外,(有点)理论上的担忧是 Drain
需要 导致原始结构成为任何类型的有效实例,也就是说,要么保留不变量,或在最后修复它们,而 IntoIter
可以随心所欲地破坏结构,因为它可以完全控制值。
我只说“有点”理论上的,因为在 std
中已经有一个小的、真实世界的例子:HashMap
暴露了 .drain
和 .into_iter
通过它的内部 RawTable
类型,它也有那些方法。 into_iter
可以是read the hash of the value being moved directly就是这样,但是 drain
必须小心 to update the hash to indicate that the cell is then empty ,而不只是阅读它。显然,在这种情况下,这绝对是很小的(可能只有一两个额外的指令),但对于像树这样更复杂的数据结构,打破数据结构的不变量可能会带来一些重要的 yield 。
关于iterator - 我什么时候应该使用 `drain` 与 `into_iter` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27882800/
这将失败: fn ppv(arr: &mut Vec) { if arr.len() ) { if arr.len() src/main.rs:12:29 | 2 | f
从表面上看,两者都像drain和 into_iter提供类似的迭代器,即遍历集合的值。然而,它们是不同的: fn main() { let mut items1 = vec![0u8, 1,
我正在做 Rust by Example具有此代码段的教程: // Vec example let vec1 = vec![1, 2, 3]; let vec2 = vec![4, 5, 6]; //
在书中Learning Rust With Entirely Too Many Linked Lists ,它会尝试为列表创建一个迭代器: pub struct IntoIter(List); imp
我是 Rust 新手,我测试了以下代码并得到了一个问题。 slice 的类型是 [T] 吗?如果是这样,[T] 是未调整大小的,但是当我编译代码时它通过了。这是为什么? #[test] fn test
所以如果我有一个 mut v: Vec我只想维护活着的 我愿意 v = v.into_iter().filter(|&foo| non_trivial_function_returning_a_res
我正在阅读 Rust 101 tutorial ,其中作者以传递给函数的 Vec 对象为例讨论了共享借用。下面是本教程所教内容的稍微改编的 MWE。有趣的部分是 vec_min 中的 v.iter()
我是一名优秀的程序员,十分优秀!